ddng.net
当前位置:首页 >> C语言 为什么指向一维数组的指针是简单变量指针而不是数组指针? >>

C语言 为什么指向一维数组的指针是简单变量指针而不是数组指针?

指向一维数组的指针也“不是简单变量指针而是数组指针”.你把一维数组首指针与指向一维数组的指针混淆了.操作一维数组就是操作一维数组的元素,而元素是挨个存放的,所以只需要其中一个元素(通常是下标为0的元素)的指针就可以

1. p=&a;才是=号两边类型匹配.因为p被声明为指向有4个元素的一维整型数组的指针,而a被定义为一个整型数组的第一个元素的指针,所以写成p=a;等号两边类型不匹配,连编译都过不了.而&a就是一个有4个整型元素的一维数组的指针

int (*p)[2]是一维数组的指针,数组里面的元素是整形,指针指向这个数组,int *p[3]是指针数组,首先是个数组,这个数组里面存放的元素都是指针

对于一维数组来说,p是存储数组的地址,*(p+n)为该地址第n个位置的数值.对于二维数组来说,*(p+i)指向第i组的存储地址,而*(*(p+i)+j)才是存储地址中第i组第j位的值.在定义二维数组的时候,调试中,我们可以发现,每组数据的地址不是连续的,所以需要用指针数组来分别指向,当你把*p[4]的[4]去掉,指针就会出错就会发生错误.

1. c语言中指针数组元素与一般么指针变量没有区别例如:int * a[10] ; int * p; int data=0;则 a[0]=&data; p=&data;都是可以的2. 为什么一般的指针不能指向二维数组,而一个指针数组元素却可以?我觉得你的这个问题问的有问题,应该是问:为什么一般的指针不能指向二维数组,而一个指向数组的指针变量却可以吧?例如:int (* pa)[10][10] ;//定义一个指向整型二维数组的指针 int * p; int data[10][10];则 pa=&data;//可以而 p=&data;//不可以

省掉〔4〕,*p虽然指向了数组score首地址,但这样的话,输出语句printf("%5.2f ",*(*(p+n)+i));无法指向数组的第二行,指针p是一普通地址变量,它只能进行简单的移位*(p+n),而不能实现*(*(p+n)+i)).这就是报错的原因

指向数组的指针其实就是指向数组第一个元素的指针,C语言中数组名就是指向数组中第一个元素的指针.如有数组a[10],那么a就是指向第一个元素a[0]的指针

中文译得比较绕人,简单说数组的指针本质是指针,指针数组本质是个数组.数组指针:a pointer to an array,即指向数组的指针指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针还要注意的是他们用法的区别,下面举例说明.int (*a)[4] 数组指针 表示:指向数组a的指针 元素表示:(*a)[i] int* a[4] 指针数组 表示:数组a中的元素都为int型指针 元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*

区别在于类型不同. int (*p)[4]:定义数组保存int类型的数据. int* p[4]:定义数组保存int*类型的数据. int (*p)[4]中(*p)声明p为指针,本例中p将代替一个数组成为一个数组指针. int* p[4]中int*声明了数组只能存放整形指针类型的数据,因此这个数组为指针数组.

printf("%#x\n",&a[0]);这句话的意思是输出a[0]的地址.printf ("%#X\n",a);这句话的意思也是输出a[0]的地址.这里的a并不是表示一个常量,它表示的是一个指向a数组的一个指针,并且是指向数组开始的a[0],C里面把数组当做指针来操作.而在声明的时候就已经给数组a分配了固定的内存空间,它的每个元素的地址是固定不变的.至于你的赋值操作对内存地址是没有影响的,它只是把这个值储存到那个地址里的内存空间.就像,你定了房间,你的门牌号是不变的,不管你放什么东西到房间里,门牌号都不会改变

zxqs.net | gmcy.net | ppcq.net | nwlf.net | rtmj.net | 网站首页 | 网站地图
All rights reserved Powered by www.ddng.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com