浅谈C语言指针

首先,先明白,指针是什么?

许多C语言课本都说指针就是地址,听完一个牛人讲课后,他说这个观点是不全正确的,即,指针不只是地址。那它是什么?

首先我们先要明白两个运算符:&(取地址运算符)和*(指向运算符)

例:int x=3;

printf("%d    %xd",&x,&x+1);输出结果我们发现&x+1比&x大了4,但是我们只是加了个1,
但为什么结果感觉不对呢?
因为x是int型,x+1的确是比x大1,但是&x的类型是int *型,上面的+1其实是+1*sizeof(int);
我们都知道&x算出来的是变量x所在空间(4B)的第一个字节的地址,+1之后就会“跳出”这个4B的空间,
那就说明&x就表示了这一块4B的空间,&x是int *型,
&x算出来的值是这个空间的第一个(从低地址到高地址)的值,它不仅仅能表示值,而且还能表示这个空间
的大小,这样才能在内存中找到它的位置并正确的修改,存,取该空间中的值;这样就体现了地址与内存
空间的关系,变量的地址-->内存,
是一个单向的映射关系,每一个变量地址都对应着一块空间,
而这种映射,或者是称之为指向关系,我们把它称作——指针;    
*(指向运算符)就是体现了这种指向关系;

例:int x=3;

printf("%d",*&x);//这里先运算&x,&x就表示x变量的地址,而*&x则是指向那个空间;

接下来谈谈指针与数组:(接下来的理论,都是在系统可以连续分配空间的前提下)

系统在给变量分配内存空间的时候,一般是从高地址到低地址连续分
配(理论上,实际操作是可能会出错);

例:int x=3,y=5,z=7; 则对于变量x,它的变量地址就是&x,因为x,y,z是连续分配的,所以,x的变量地址还可以表示为&y+1,或者&z+2。而变量x中的值,可以直接使用x,或者&x<->(&x)[0],(&y+1)<->(&y)[1],*(&z+2)<->(&z)[2];

看出来了吗?其实这三个变量个起来就是一个数组

若定义一个int *a; a=&z;

则a[0]==z,a[1]==y,a[2]==x;在本质上,这就是一个数组,数组名就是a,a就是&z;

在int a[10];这个数组中,a就是&a[0];a[0]就相当于上例中的z;

在二维数组中也是同样的道理,例int a[2][3]={{1,2,3},{4,5,6}};
a就是&a[0],也就是说a指a[0],即a指向{1,2,3};

对于c的指针和地址,这是今天一个牛人讲完课后我的一些个人理解,如果大家发现了错误或者有不妥的地方请大家指正出来,我也是一个学习者,希望这篇文章可以帮助到大家。

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/80386928