目录
C 语言中的指针学习起来既简单又有趣。某些 C 编程任务使用指针可以更轻松地执行,而其他任务(如动态内存分配)则无法使用指针来执行。因此,有必要学习指针才能成为一名完美的C程序员。让我们开始通过简单易行的步骤学习它们。
如您所知,每个变量都是一个内存位置,每个内存位置都定义了其地址,可以使用与号 (&) 运算符访问该地址,该运算符表示内存中的地址。考虑以下示例,该示例打印了定义的变量的地址 -
<span style="color:#747579"><span style="color:#880000">#include</span> <span style="color:#008800"><stdio.h></span>
<span style="color:#000088">int</span><span style="color:#000000"> main </span><span style="color:#666600">()</span> <span style="color:#666600">{</span>
<span style="color:#000088">int</span><span style="color:#000000"> var1</span><span style="color:#666600">;</span>
<span style="color:#000088">char</span><span style="color:#000000"> var2</span><span style="color:#666600">[</span><span style="color:#006666">10</span><span style="color:#666600">];</span><span style="color:#000000">
printf</span><span style="color:#666600">(</span><span style="color:#008800">"Address of var1 variable: %x\n"</span><span style="color:#666600">,</span> <span style="color:#666600">&</span><span style="color:#000000">var1 </span><span style="color:#666600">);</span><span style="color:#000000">
printf</span><span style="color:#666600">(</span><span style="color:#008800">"Address of var2 variable: %x\n"</span><span style="color:#666600">,</span> <span style="color:#666600">&</span><span style="color:#000000">var2 </span><span style="color:#666600">);</span>
<span style="color:#000088">return</span> <span style="color:#006666">0</span><span style="color:#666600">;</span>
<span style="color:#666600">}</span></span>
当上面的代码被编译和执行时,它会产生以下结果 -
<span style="color:#000000">Address of var1 variable: bff5a400
Address of var2 variable: bff5a3f6
</span>
什么是指针?
指针是一个变量,其值是另一个变量的地址,即内存位置的直接地址。与任何变量或常量一样,必须先声明指针,然后才能使用它来存储任何变量地址。指针变量声明的一般形式是 -
<span style="color:#000000">type *var-name;
</span>
在这里,类型是指针的基类型;它必须是有效的 C 数据类型,并且 var-name 是指针变量的名称。用于声明指针的星号 * 与用于乘法的星号相同。但是,在此语句中,星号用于将变量指定为指针。看看一些有效的指针声明 -
<span style="color:#000000">int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */
</span>
所有指针的值(无论是整数、浮点数、字符还是其他)的实际数据类型都是相同的,即表示内存地址的长十六进制数。不同数据类型的指针之间的唯一区别是指针指向的变量或常量的数据类型。
如何使用指针?
有一些重要的操作,我们将非常频繁地在指针的帮助下完成。(a) 我们定义一个指针变量,(b) 将变量的地址分配给指针,(c) 最后访问指针变量中可用地址的值。这是通过使用一元运算符 * 完成的,该运算符返回位于其操作数指定的地址的变量的值。以下示例使用这些操作 -
<span style="color:#747579"><span style="color:#880000">#include</span> <span style="color:#008800"><stdio.h></span>
<span style="color:#000088">int</span><span style="color:#000000"> main </span><span style="color:#666600">()</span> <span style="color:#666600">{</span>
<span style="color:#000088">int</span> <span style="color:#000088">var</span> <span style="color:#666600">=</span> <span style="color:#006666">20</span><span style="color:#666600">;</span> <span style="color:#880000">/* actual variable declaration */</span>
<span style="color:#000088">int</span> <span style="color:#666600">*</span><span style="color:#000000">ip</span><span style="color:#666600">;</span> <span style="color:#880000">/* pointer variable declaration */</span><span style="color:#000000">
ip </span><span style="color:#666600">=</span> <span style="color:#666600">&</span><span style="color:#000088">var</span><span style="color:#666600">;</span> <span style="color:#880000">/* store address of var in pointer variable*/</span><span style="color:#000000">
printf</span><span style="color:#666600">(</span><span style="color:#008800">"Address of var variable: %x\n"</span><span style="color:#666600">,</span> <span style="color:#666600">&</span><span style="color:#000088">var</span> <span style="color:#666600">);</span>
<span style="color:#880000">/* address stored in pointer variable */</span><span style="color:#000000">
printf</span><span style="color:#666600">(</span><span style="color:#008800">"Address stored in ip variable: %x\n"</span><span style="color:#666600">,</span><span style="color:#000000"> ip </span><span style="color:#666600">);</span>
<span style="color:#880000">/* access the value using the pointer */</span><span style="color:#000000">
printf</span><span style="color:#666600">(</span><span style="color:#008800">"Value of *ip variable: %d\n"</span><span style="color:#666600">,</span> <span style="color:#666600">*</span><span style="color:#000000">ip </span><span style="color:#666600">);</span>
<span style="color:#000088">return</span> <span style="color:#006666">0</span><span style="color:#666600">;</span>
<span style="color:#666600">}</span></span>
当上面的代码被编译和执行时,它会产生以下结果 -
<span style="color:#000000">Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20
</span>
空指针
最好将 NULL 值分配给指针变量,以防没有要分配的确切地址。这是在变量声明时完成的。分配为 NULL 的指针称为空指针。
NULL 指针是在多个标准库中定义的值为零的常量。考虑以下程序 -
<span style="color:#747579"><span style="color:#880000">#include</span> <span style="color:#008800"><stdio.h></span>
<span style="color:#000088">int</span><span style="color:#000000"> main </span><span style="color:#666600">()</span> <span style="color:#666600">{</span>
<span style="color:#000088">int</span> <span style="color:#666600">*</span><span style="color:#000000">ptr </span><span style="color:#666600">=</span><span style="color:#000000"> NULL</span><span style="color:#666600">;</span><span style="color:#000000">
printf</span><span style="color:#666600">(</span><span style="color:#008800">"The value of ptr is : %x\n"</span><span style="color:#666600">,</span><span style="color:#000000"> ptr </span><span style="color:#666600">);</span>
<span style="color:#000088">return</span> <span style="color:#006666">0</span><span style="color:#666600">;</span>
<span style="color:#666600">}</span></span>
当上面的代码被编译和执行时,它会产生以下结果 -
<span style="color:#000000">The value of ptr is 0
</span>
在大多数操作系统中,不允许程序访问地址 0 处的内存,因为该内存由操作系统保留。但是,内存地址 0 具有特殊意义;它指示指针不打算指向可访问的内存位置。但按照惯例,如果指针包含 null(零)值,则假定它不指向任何内容。
要检查空指针,您可以使用“if”语句,如下所示 -
<span style="color:#000000">if(ptr) /* succeeds if p is not null */
if(!ptr) /* succeeds if p is null */
</span>
详细指针
指针有很多但简单的概念,它们对 C 编程非常重要。以下重要的指针概念对于任何 C 程序员来说都应该很清楚 -
Sr.No。 | 概念和描述 |
---|---|
1 | 指针算术 有四个算术运算符可用于指针:++、--,+、- |
2 | 指针数组 您可以定义数组来保存多个指针。 |
3 | 指针到指针 C 允许您将指针放在指针上,依此类推。 |
4 | 在 C 语言中传递指向函数的指针 通过引用或地址传递参数,被调用函数可以在调用函数中更改传递的参数。 |
5 | 从 C 中的函数返回指针 C 允许函数返回指向局部变量、静态变量和动态分配的内存的指针。 |