关于C语言指针的几个常见问题

众所周知,“指针”是程序设计语言'C'的一个核心概念,而因为“指针”的特殊性,它往往会给C语言的初学者带来不少的困惑。本文总结了几个日常学习C语言常见的几个问题,希望有助于初学者们对于“指针”概念的理解。

“指针”是什么?

“指针”是C语言中的一种数据类型,从数据类型角度来看,指针和int、char等其它数据类型并没有什么区别:“指针”也要占用一定的内存空间;指针也可以取值、赋值;指针也可以进行各种数学运算、逻辑运算等。

“指针”区别于其它数据类型的特殊地方,在于”指针“所占用的那块内存空间里,存放的不是通常的数值或字符,而是另外一块内存空间的地址,也就是常说的指针指向的那块内存。

<code>int x = 100;
int *p = &x;/<code>
关于C语言指针的几个常见问题

指针指向另一块内存

指针运算符'*'、'&'

如上所述,指针变量所占的内存空间里面存放的是另一块内存空间的地址,而获取某个变量(包括指针变量)的内存地址就需要使用指针运算符'&':

<code>int x = 100;
int *p = &x;/<code>

进而,通过指针变量来访问它所指向的那块内存空间中的内容时,则需要使用另外一个指针运算符'*':

<code>int y = *p; 
assert(y == x);/<code>

“指针类型”是什么?

在通常的C语言教材中,都会看到“指针类型”这个说法,但“指针类型”说的不是指针变量本身的数据类型(指针变量的数据类型就是“指针”),而是指针变量指向的那块内存中存放的内容的数据类型:

<code>int x = 100; 
int *p = &x; //变量'p'的数据类型是“指针”,'p'指向的内存中存放的是int类型的变量,'p'的指针类型是int。/<code>

指针加减运算

在很多C语言源代码中,都会看到对“指针”变量进行加减运算,虽然“指针”变量中存储的内存地址是一个数值,但是对“指针”进行加减运算并不是直接的对这个数值的加减,而是根据上面所说的“指针类型”进行特定的加减运算。

对于“指针”的加减运算,可以简单地理解为一个加权运算过程,比如对于一个“指针”加数值'a',即是将“指针”变量本身的内存地址加上数值'a'乘以“指针类型”占用的内存大小(字节数):

指针变量 + a = 指针变量地址 + sizeof(指针类型) * a

<code> #include <stdio.h> 

int main() {
int x = 100;
int *p = &x;

printf("sizeof(int) = %d\\n", sizeof(int));
printf("p = %p\\n", p);
printf("p + 3 = %p\\n", p + 3);
return 0;
}/<stdio.h>/<code>

上面代码的输出结果如下所示,可以看出'p+3'是在'p'的地址上加了4 * 3。

关于C语言指针的几个常见问题

指针加运算

以上是我想到的关于C语言“指针”的几个常见问题的理解,欢迎讨论、指导。


分享到:


相關文章: