C语言指针数组问题

   更新日期:2024.05.21
1. int (*p)[3], p = a + 2
()优先级先于[],因此p先是指针,是什么指针呢?由[]知道是一个指向数组的指针,因此他其实简单来说就是个指向长度为三的一维数组的指针。
如果是数组b[3],那么b实际上代表的就是他第一个元素的地址,即b指向b[0].那么对于二维数组,我们可以将二维看成一维(将一行看成一个。。),那么a[3][3]中,a代表的其实就是他第一行的首地址,那么a+2就是代表第三行(最后那行)的首地址,p=a+2,就是令p指向了a[3][3]的最后一行,这符合p的性质(指向数组的指针),因此是对的。。
2. int *p , p = *( a + 2 )
p定义成了一个指针,指向一个int型变量的指针,根据1的解释,a+2指向了a[3][3]的最后一行,那么*(a+2)其实就是最后一行中的首元素的地址,p指向了这个首元素,符合p的定义,正确
3. int (*p)[3], p = *( a + 2 )
根据1的解释,p是指向数组的指针;根据2的解释,*(a+2)其实是a[3][3]中最后一行的首元素的地址,如果令p=*(a+2),就是要p指向这个首元素,这违背了p的定义(指向数组而不是指向单个元素),因此是错误的。。
4.int *p, p = a + 2
根据2,p应该指向单个元素,但是根据1,a+2实际上是a[3][3]最后一行的地址,如果令p=a+2,就是要让p指向a[3][3]的最后一行,违背了p的定义(指向单个元素而不是指向数组),因此是错误的。。

#include<stdio.h>
int main(void)
{
int i;
int a[3][3]={1,2,3,4,5,6,7,8,9};
int (*p)[3];

p = *(a+2);//错误

return 0;
}
这儿,指针p为指向3个元素的指针, *(a+2)为 a[2][0]的地址,所以错误
#include<stdio.h>
int main(void)
{
int i;
int a[3][3]={1,2,3,4,5,6,7,8,9};
int * p;

p = a+2;//错误

return 0;
}
p为int 型指针,而a+2是a[2]的地址,即第三行的地址,所以错误

建议弄明白 指向多个元素的指针 和 指针数组 这两个概念

int (*p)[3]; 是一个数组的指针,是个指针,只不过这个指针是指向一个3个元素的数组的。
int *p 是一个指针,指向一个整形变量。而a+2 是一个地址,所以错误。概念要搞清楚。

第一个main函数定义了P的整型指针数组,所以可以p=a+2,这里a也是数组,可以相加;第二个main函数定义的是P的整形指针,而a是数组,相加后要转换成整形指针才能相得。

  • 17617171758 :C语言 指针问题
    向堵固1461 :答:int a[2][3], *p[3];分析:对于a来说,毫无疑问,a是一个二维数组,a的值指向int类型的起始地址。对于p,首先p先与'[ ]'结合 p[3],表示p是一个数组,p再与'*'结合成' *p[3] ',表示p数组里面存放的时指针变量,最后与int类型结合成' int *p[3] ',表示数组存放的时指向int类型...
  • 17617171758 :C语言指针数组问题
    向堵固1461 :答:。),那么a[3][3]中,a代表的其实就是他第一行的首地址,那么a+2就是代表第三行(最后那行)的首地址,p=a+2,就是令p指向了a[3][3]的最后一行,这符合p的性质(指向数组的指针),因此是对的。。2. int *p , p = *( a + 2 )p定义成了一个指针,指向一个int型变量的指针...
  • 17617171758 :c语言指针问题解答?
    向堵固1461 :答:一、P指向a存值的地址,如p指向地址的内存的值为0001,则*p=0001(为1),这时修改*p=0010,则a的值相应的被修改为2。二、我们只能通过*p修改a的值,p是一个地址指针,更改p后 p指向了另一块内存,a的值不会被更改。三、int *p[] p是一个数组,数组内每个元素都是int*类型,也就是指向整型...
  • 17617171758 :c语言指针数组问题
    向堵固1461 :答:a和p都是地址,但是a是常量,它的值不能改变(并不是说它所指向的内容不变),这是数组指针和普通指针的唯一区别 p=a和p=a是不同的,*p=a是把a中存储的数组的首地址赋值给了p所指向的内存区域,所以,p指向的就是数组a的首地址(如果你在进行这一步之前没有给p分配它要指向的存储空间的话...
  • 17617171758 :c语言指针与数组问题!
    向堵固1461 :答:这个问题关键在于理解指针为什么要有类型。其实不同类型的指针本质上都是一样的,即内存地址,地址本身是没有类型的,赋予指针类型的意义在于给出存储数据的字节宽度,也称数据对齐宽度。比如 int *pt,pt是一个整数指针,那么编译器便知道如果通过pt读取数据时需要一次读取4字节,因为那里存放着一个int。...
  • 17617171758 :C语言,指针 与 数组。
    向堵固1461 :答:2. 用字符指针实现。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。[例8.12]void main(void){char *string="I Love China!";printf("%s\n",string);} 在这里没有定义字符数组,但C语言对字符串常量是按字符数组处理的,实际上在内存开辟了一个字符数组用来存放字符串...
  • 17617171758 :求助:C语言二维数组指针问题
    向堵固1461 :答:神奇的是对数组而言,a、a[0]、*a的值是一样的,都是0x99!你可能会想这不可能吧 但如果你使用*a操作,你会发现效果就是等价于a[0],不会直接取值(指向数组的指针的奇怪之处)此时a的值是0x99 a赋给p的值是0x99 而对p来说就不一样(p不是指向数组的指针),*p真的是对那个地址的内存取值...
  • 17617171758 :C语言选择题,关于指针数组。求详解
    向堵固1461 :答:int a[2][3]; 定义了一个二维函数,每一维数组有三个元素。int (*pt)[3]; 定义了一个数组指针,也就是定义了一个指向有三个元素的指针,即该指针,每次自加1,地址跳过三个int pt=a; 就是让pt指向a[0],注意a[0]是一个数组地址,里面有三个元素 对于A选项,pt[0][0]是正确的,...
  • 17617171758 :求c语言指针方式引用二维数组问题
    向堵固1461 :答:都是19ff18。它们是a[1][0](元素3)的存放位置,19ff0C+3×4=19ff0c+12=19ff0c+c=19ff18。后面也是类似解释。具体p1、p2、p3的使用,是前面定义了三个字符串,此处拿来使用。你可以直接把p1的内容"%x,%x,%x,%x,%x\n"拿来替换掉p1,就好理解了。有什么问题请留言。
  • 17617171758 :c语言 指针与数组的问题。
    向堵固1461 :答:p=*(p+1)相当于p[i]=p[i+1]前面的*p就相当于取当前地址变量p指向的地址空间内所表示的值 p=任何东西,就相当于改变了这个地址空间所表示的值,至于地址的值是什么不需要考虑 (p+1)括号里面的,就相当于地址位置向下挪一位,具体地址的值也是不需要考虑的,只要能取得p地址的下一个地址...
  • 相关链接

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