您的位置:首页 > 编程语言 > C语言/C++

c语言指针,数组

2014-05-22 22:24 141 查看
指针:说简单点就是一个地址。例如int *p,p是个变量,里面放的是地址0x0000,同理,每一个指针,不管什么类型,都是地址,也就是空间都是4个字节(32位机)。

以此类推,指针也有指向它的指针int **f,f是一个变量,它指向的是一个指针,f里面放的也是一个地址。也是4个字节。

而且记得放在=号的左右两边是不一样的表示。*p放在右边表示这个值,放在左边表示放这个值的那块空间。

永远记住,只有这个表达式可以表示空间的时候,才能放到左边。

例如说结构EX,typedef struct Node{int a,char b[10]}EX;

EX x={1,{1.,2,3}};

EX *p=&x;

p->b它不可以作为一个左值,因为他这个表达式的意思是表示数组的首地址,它是一个常量。就和数组名称不能做左值一样,因为他也是一个常量。

指针可以指向任何类型。

x=y;x的含义是x所代表的的地址,y的含义是有所代表的地址里面的内容。记住要将等号两边的整体的东西来看,p就是p,*p就是*p,不要缺少东西的看,因为他们表示的东西根本不同。

int a[100];当a作为右值时代表的是数组首元素的地址,和&a[0]一样,但是注意,这仅仅是代表,而没有一个地方来存储这个地址,也就是说编译器并没有为数组a分配一块内存来保存其地址,这一点与指针有很大差别。由此,可见a不能作为左值。编译器会认为数组名作为左值代表的意思是a的首元素的首地址,但是这个地址开始的一块内存是一个总体,我们只能访问数组的某个元素而无法把数组当做一个总体进行访问,我们可以把a[i]当做左值,但是无法把a当做左值。

1.最简单的,对常用变量取址

int a=100;int *p=&a;(int *p;p=&a)

2.指向数组的指针

int vector[10],*vp=vector;这个没什么问题,定义一个整型指针,指向数组的首地址(我们知道,数组名称也表示数组的首地址)

int matrix[3][10];*vp=matrix;这个是不对的,因为matrix不是一个指向整型的指针,它是一个指向整型数组的指针。int (*p)[10],这个表达式要这么理解,因为可以对p进行*操作,所以p肯定是指针,接下来执行下标引用,所以p指向的是某种类型的数组。由于p是指向一个整型数组的指针,所以p+1,p+2它每加一次是要根据10个整型值的长度进行调整。如果需要一个一个移动,那么就是int *p=matrix[0];int
*p=&matrix[0][0];

3.指针数组

int *api[10];这个先要进行下标操作,所以api是一个数组,又由于可以对数组元素做*操作,所以它的元素肯定是指针。所以他是指针数组。

数组:一个连续的空间放着一堆同样类型的东西。这一堆东西可以是任何类型,整型,字符型,指针等等。

我们对于连续的东西,有一个认识,只要知道了第一个的信息,后面的直接加,就可以知道了,所以关键的是表示第一个的信息。

这个时候数组的名字就发挥了作用,数组名可以表示第一个元素的位置,也可以表示本数组的首地址。(这两个概念有区别:别人举了个例子应该很形象&a[0],&a这两个值相同,但意义不同,一个是第一个元素的地址,一个是数组的首地址,就相当于湖南的省政府在长沙,长沙的市政府也在长沙,但代表的意义不同)。

指针和数组的关系

指针和数组没有任何关系。

指针就是指针,指针变量在32位系统下,永远占4个字节,其值为某一个内存的地址,指针可以指向任何地方,但是并不是任何地方你都能通过这个指针变量来访问到。

数组就是数组,其大小与元素的类型和个数有关,定义数组时必须指定其元素的类型和个数。数组可以存任何类型的数据,但是不能存函数。

指针的移动

一个类型为T的指针的移动,是以sizeof(T)为移动单位的。

int a[5]={1,2,3,4,5};&a+1取数组的首地址,该地址加上sizeof(a)的值,即&a+5*sizeof(int),也就是下一个数组的首地址,显然当前指针已经过了界。

*(a+1):a和&a的值是一样的,但是意思不一样,a是数组首元素的地址,也就是a[0]的地址,&a是数组的首地址,a+1是数组的下一个元素的地址,即a[1]的地址,&a+1是下一个数组的首地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: