<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C语言 归档 - 帝讯博客</title>
	<atom:link href="https://www.dixunblog.cn/collection/c%e8%af%ad%e8%a8%80/feed" rel="self" type="application/rss+xml" />
	<link>https://www.dixunblog.cn/collection/c语言</link>
	<description>致力于打造专业的互联网资讯平台</description>
	<lastBuildDate>Fri, 27 Mar 2026 02:07:33 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://cdn.hyclive.cn/dixunblog/2025/12/cropped-ico-32x32.png</url>
	<title>C语言 归档 - 帝讯博客</title>
	<link>https://www.dixunblog.cn/collection/c语言</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>C 语言指针详解：从入门到精通的完整指南</title>
		<link>https://www.dixunblog.cn/1286.html</link>
					<comments>https://www.dixunblog.cn/1286.html#respond</comments>
		
		<dc:creator><![CDATA[小编]]></dc:creator>
		<pubDate>Thu, 26 Mar 2026 16:34:08 +0000</pubDate>
				<category><![CDATA[技术教程]]></category>
		<category><![CDATA[编程代码]]></category>
		<guid isPermaLink="false">https://www.dixunblog.cn/1286.html</guid>

					<description><![CDATA[<p>指针是 C 语言的灵魂，也是很多初学者最头疼的概念。本文通过大量实例，带你彻底理解 C 语言指针的核心用法，包括指针基础、数组与指针、函数指针、动态内存分配等。</p>
<p><a href="https://www.dixunblog.cn/1286.html">C 语言指针详解：从入门到精通的完整指南</a>最先出现在<a href="https://www.dixunblog.cn">帝讯博客</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>指针是 C 语言的灵魂，也是很多初学者最头疼的概念。本文将通过大量实例，带你彻底理解 C 语言指针的核心用法。</p>
<p><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-1322" src="http://cdn.hyclive.cn/dixunblog/2026/03/C-语言指针主题.png" alt="" width="2730" height="1535" /></p>
<h2>什么是指针？</h2>
<p>简单来说，指针就是一个变量，它存储的是另一个变量的内存地址。想象一下，你家的地址就是一个&#8221;指针&#8221;，通过这个地址可以找到你家。</p>
<pre><code class="language-c">#include &lt;stdio.h&gt;

int main() {
    int age = 25;        // 定义一个整型变量
    int *p = &amp;age;       // p 是指针，存储 age 的地址
    
    printf("age 的值：%d\n", age);
    printf("age 的地址：%p\n", &amp;age);
    printf("指针 p 的值：%p\n", p);
    printf("指针 p 指向的值：%d\n", *p);
    
    return 0;
}</code></pre>
<p>输出结果：</p>
<pre><code>age 的值：25
age 的地址：0x7fff5fbff6ac
指针 p 的值：0x7fff5fbff6ac
指针 p 指向的值：25</code></pre>
<h2>指针的核心运算符</h2>
<h3>1. 取地址运算符 &amp;</h3>
<pre><code class="language-c">int a = 10;
int *ptr = &amp;a;  // &amp;a 获取变量 a 的地址</code></pre>
<h3>2. 解引用运算符 *</h3>
<pre><code class="language-c">int a = 10;
int *ptr = &amp;a;
printf("%d", *ptr);  // *ptr 获取 ptr 指向的值，输出 10</code></pre>
<h2>指针与数组</h2>
<p>指针和数组有着密切的关系，数组名本质上就是一个常量指针。</p>
<pre><code class="language-c">#include &lt;stdio.h&gt;

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr;  // ptr 指向数组第一个元素
    
    // 两种访问方式等价
    printf("arr[0] = %d\n", arr[0]);
    printf("*ptr = %d\n", *ptr);
    
    // 指针算术运算
    for(int i = 0; i &lt; 5; i++) {
        printf("arr[%d] = %d\n", i, *(ptr + i));
    }
    
    return 0;
}</code></pre>
<h2>指针与函数</h2>
<h3>1. 指针作为函数参数</h3>
<p>通过指针可以实现&#8221;传地址调用&#8221;，在函数内部修改外部变量的值。</p>
<pre><code class="language-c">#include &lt;stdio.h&gt;

// 交换两个数的值
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 10, y = 20;
    swap(&amp;x, &amp;y);
    printf("x = %d, y = %d\n", x, y);  // 输出：x = 20, y = 10
    return 0;
}</code></pre>
<h3>2. 返回指针的函数</h3>
<pre><code class="language-c">// 返回数组中最大值的指针
int* findMax(int arr[], int size) {
    int *maxPtr = &amp;arr[0];
    for(int i = 1; i  *maxPtr) {
            maxPtr = &amp;arr[i];
        }
    }
    return maxPtr;
}</code></pre>
<h2>二级指针</h2>
<p>指针本身也是变量，也有地址，指向指针的指针就是二级指针。</p>
<pre><code class="language-c">#include &lt;stdio.h&gt;

int main() {
    int a = 100;
    int *p1 = &amp;a;      // 一级指针
    int **p2 = &amp;p1;    // 二级指针
    
    printf("a = %d\n", a);
    printf("*p1 = %d\n", *p1);
    printf("**p2 = %d\n", **p2);
    
    return 0;
}</code></pre>
<h2>动态内存分配</h2>
<p>指针最重要的应用之一就是动态内存管理。</p>
<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main() {
    // 动态分配数组
    int n = 5;
    int *arr = (int*)malloc(n * sizeof(int));
    
    // 使用动态数组
    for(int i = 0; i &lt; n; i++) {
        arr[i] = (i + 1) * 10;
    }
    
    // 打印结果
    for(int i = 0; i &lt; n; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
    
    // 释放内存
    free(arr);
    arr = NULL;  // 避免野指针
    
    return 0;
}</code></pre>
<h2>常见指针错误</h2>
<h3>1. 野指针</h3>
<pre><code class="language-c">// 错误示例
int *ptr;  // 未初始化的指针
*ptr = 10; // 危险！ptr 指向未知地址

// 正确做法
int *ptr = NULL;  // 初始化为 NULL
int a = 10;
ptr = &amp;a;         // 再赋值有效地址</code></pre>
<h3>2. 内存泄漏</h3>
<pre><code class="language-c">// 错误示例
int *ptr = (int*)malloc(sizeof(int));
*ptr = 10;
// 忘记 free(ptr)，导致内存泄漏

// 正确做法
int *ptr = (int*)malloc(sizeof(int));
*ptr = 10;
// 使用完毕后
free(ptr);
ptr = NULL;</code></pre>
<h3>3. 悬空指针</h3>
<pre><code class="language-c">// 错误示例
int *getPointer() {
    int local = 100;
    return &amp;local;  // 错误！返回局部变量地址
}

// 正确做法
int *getPointer() {
    int *ptr = (int*)malloc(sizeof(int));
    *ptr = 100;
    return ptr;  // 返回动态分配的内存
}</code></pre>
<h2>实战练习</h2>
<h3>题目 1：字符串反转</h3>
<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

void reverseString(char *str) {
    char *start = str;
    char *end = str + strlen(str) - 1;
    char temp;
    
    while(start &lt; end) {
        temp = *start;
        *start = *end;
        *end = temp;
        start++;
        end--;
    }
}

int main() {
    char str[] = "Hello, World!";
    printf("原字符串：%s\n", str);
    reverseString(str);
    printf("反转后：%s\n", str);
    return 0;
}</code></pre>
<h3>题目 2：冒泡排序（指针实现）</h3>
<pre><code class="language-c">#include &lt;stdio.h&gt;

void bubbleSort(int *arr, int n) {
    for(int i = 0; i &lt; n - 1; i++) {
        for(int j = 0; j  *(arr + j + 1)) {
                int temp = *(arr + j);
                *(arr + j) = *(arr + j + 1);
                *(arr + j + 1) = temp;
            }
        }
    }
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    bubbleSort(arr, n);
    
    printf("排序后：");
    for(int i = 0; i &lt; n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}</code></pre>
<h2>总结</h2>
<p>指针是 C 语言的核心，掌握指针需要大量实践。以下是学习建议：</p>
<ol>
<li><strong>理解概念</strong>：指针就是地址，*和&amp;是核心运算符</li>
<li><strong>多画图</strong>：画出内存图帮助理解指针指向</li>
<li><strong>多练习</strong>：通过实际编程加深理解</li>
<li><strong>注意内存管理</strong>：malloc 和 free 配对使用</li>
<li><strong>避免常见错误</strong>：野指针、内存泄漏、悬空指针</li>
</ol>
<p>指针虽然难，但一旦掌握，你的 C 语言水平会有质的飞跃。加油！💪</p>
<hr />
<p><strong>下节预告</strong>：《数据结构基础：链表与指针的完美结合》</p>
<p><em>如果你觉得本文有帮助，欢迎收藏、转发，让更多人看到！</em></p>
<p><a href="https://www.dixunblog.cn/1286.html">C 语言指针详解：从入门到精通的完整指南</a>最先出现在<a href="https://www.dixunblog.cn">帝讯博客</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dixunblog.cn/1286.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
