c语言指针与数组问题!

   更新日期:2024.06.02
这个问题关键在于理解指针为什么要有类型。其实不同类型的指针本质上都是一样的,即内存地址,地址本身是没有类型的,赋予指针类型的意义在于给出存储数据的字节宽度,也称数据对齐宽度。比如 int *pt,pt是一个整数指针,那么编译器便知道如果通过pt读取数据时需要一次读取4字节,因为那里存放着一个int。换句话说指针类型定义了数据访问时的字节长度。

int a[3][4]定义了一个固定长度的二维数组,其行宽为4列int,即4*4字节为一行,可见对齐宽度为16字节,也就是每16字节划分为一行;行数为3行。其中a代表了数组首地址,其类型为int (*)[4],地址类型中的长度参数([4])取自于数组定义,由编译器确定。数组定义中包含了维度信息和内存地址及其类型,当通过数组名访问元素时必须同时指定行列索引。

为了灵活高效地寻址,可以采用指针访问数组,那么指针类型必须和数组首地址匹配(一致),因此如此定义 int (*p)[4]。可以看出该定义与数组a的地址类型只是多了个p而已,也就是明确了指针名称。那么为什么编译器会将 int a[3][4]的地址定义为 int (*)[4]呢?

二维数组的指针,其运算的基本单位是行宽,因此二维数组的指针又称为行指针,假设a的首地址为1000,p指向a,当p++时地址值是增加了一行的宽度,也即加一后p的值为1016而不是1001也不是1004。因此int (*)[4]的含义为其数据宽度为4个int的指针,从而int (*p)[4]的含义为:p是一个指向行宽为4个int的指针,也即每个元素为4字节的int,而行总字节数为4*4=16。

解读此类定义时先从括号内开始,解读顺序为:括号内是个指针p,其括号右侧是数组长度,表明指针p指向的是一个含有4个元素的行,前缀(左侧)int定义了基本数据类型,即元素类型为int,那么行宽就是4个int组成,就是4*4字节。

说了一大堆,那么如果你看明白了,p=a就不用解释了吧(赋值a的地址)。

int (*p)[4]是一个定义数组指针;
p = a;是让这个指针指向a数组;
记住,要想用指针访问数组:
一维数组 -> 一级指针
二维数组 -> 数组指针
指针数组-> 二级指针

p[2]是合法的,因为a本身为一维数组,而p也是一维指针,所以这样没问题。p[2]相当于*(p+2),也就是a[2]。
但是q[2][3]是绝对错误的,因为b是一个二维数组,而q是一维指针,所以不能这样调用。另外,q=b也是错误的,理由同上,q=&b[0][0]就对了,你可以自己思考一下为什么。

定义一个指向数组的指针 并初始化指针的值

  • 13761272049 :C语言,指针 与 数组。
    黎堵季3217 :答:2. 用字符指针实现。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。[例8.12]void main(void){char *string="I Love China!";printf("%s\n",string);} 在这里没有定义字符数组,但C语言对字符串常量是按字符数组处理的,实际上在内存开辟了一个字符数组用来存放字符串...
  • 13761272049 :C语言的数组和指针问题,谢谢高手的解答!
    黎堵季3217 :答:所以B是一个2级常指针,同样指向二维数组的第一个元素B[0],而B[0]是一个一维数组。总结,问题的关键在于,数组名相当于一个指向于这个数组第一个元素的指针。3)所以,int A[2][3][4]={0};A是一个三维数组,其中A[0]和A[1]都是它的元素,A[0]是第一个元素。所以, A是一个三级...
  • 13761272049 :c语言 指针与数组的问题。
    黎堵季3217 :答:p=*(p+1)相当于p[i]=p[i+1]前面的*p就相当于取当前地址变量p指向的地址空间内所表示的值 p=任何东西,就相当于改变了这个地址空间所表示的值,至于地址的值是什么不需要考虑 (p+1)括号里面的,就相当于地址位置向下挪一位,具体地址的值也是不需要考虑的,只要能取得p地址的下一个地址...
  • 13761272049 :C语言指针和数组的问题,急!
    黎堵季3217 :答:&a 、 a、 &a[0]都是一个值,指向首地址。&p1是取指针p1的地址,不是p1内容的地址。p1 p2相等,但是&p1 不等于p2。p3 与 数组a没关系,但是因为a[4]正好索引到数组a最后一个成员的下一个地址,因此正好是p1的地址。这段解释比较麻烦,画个图会明白些。简单的说,局部动态变量的空间是在...
  • 13761272049 :C语言数组与指针,请讲解为什么。
    黎堵季3217 :答:int (*p)[4];// 定义一个数组指针,指向含4个元素的一维数组,数组元素是int类型。int p[4];// 定义一个指针数组,数组中每个元素是一个指针,指针指向哪里就要根据程序来定了。判断数组指针与指针数组主要通过运算符的优先级来判断。int (*p)[4];// 由于()的优先级高,说明p是一个指针,...
  • 13761272049 :C语言指针数组问题
    黎堵季3217 :答:。),那么a[3][3]中,a代表的其实就是他第一行的首地址,那么a+2就是代表第三行(最后那行)的首地址,p=a+2,就是令p指向了a[3][3]的最后一行,这符合p的性质(指向数组的指针),因此是对的。。2. int *p , p = *( a + 2 )p定义成了一个指针,指向一个int型变量的指针...
  • 13761272049 :C语言数组与指针的问题
    黎堵季3217 :答:运行到第一个printf中断了一下,看到如上图结果。q恰好指向了a数组地址,实际输出的是a
  • 13761272049 :C语言选择题,关于指针数组。求详解
    黎堵季3217 :答:int a[2][3]; 定义了一个二维函数,每一维数组有三个元素。int (*pt)[3]; 定义了一个数组指针,也就是定义了一个指向有三个元素的指针,即该指针,每次自加1,地址跳过三个int pt=a; 就是让pt指向a[0],注意a[0]是一个数组地址,里面有三个元素 对于A选项,pt[0][0]是正确的,...
  • 13761272049 :一个关于C语言的指针与二维数组的问题
    黎堵季3217 :答:C语言中,数组和指针是两类不同的类型——前者的定义需要明确被指向的类型,后者的定义需要明确元素类型和数组的长度。这样定义的原因是两者本身的语义不同。引用一个表示数组的标识符(数组名)具有两重含义,一是指整个数组,二是指指向数组首个元素(而不是整个数组)的指针。具体取两种含义是上下文...
  • 13761272049 :c语言指针数组问题
    黎堵季3217 :答:a和p都是地址,但是a是常量,它的值不能改变(并不是说它所指向的内容不变),这是数组指针和普通指针的唯一区别 p=a和p=a是不同的,*p=a是把a中存储的数组的首地址赋值给了p所指向的内存区域,所以,p指向的就是数组a的首地址(如果你在进行这一步之前没有给p分配它要指向的存储空间的话...
  • 相关链接

    欢迎反馈与建议,请联系电邮
    2024 © 视觉网