c语言指针,数组

来源:互联网 发布:java中反射的概念 编辑:程序博客网 时间:2024/05/16 08:45

        指针:说简单点就是一个地址。例如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是下一个数组的首地址。


0 0
原创粉丝点击