Arrays 指向数组和二维数组的指针
我正在学习指针以及它们通常是如何工作的。我在网上找到了一些示例代码: 也许有人能帮我理解这里的问题是什么?提供的示例代码是否错误 另外,我正在从以下视频中学习: 如果你转到1:48:52,你会看到,他建议了一种类似的方法来声明一个指针,我在编译时也遇到了问题Arrays 指向数组和二维数组的指针,arrays,c,pointers,Arrays,C,Pointers,我正在学习指针以及它们通常是如何工作的。我在网上找到了一些示例代码: 也许有人能帮我理解这里的问题是什么?提供的示例代码是否错误 另外,我正在从以下视频中学习: 如果你转到1:48:52,你会看到,他建议了一种类似的方法来声明一个指针,我在编译时也遇到了问题 有人能告诉我这里出了什么问题吗?非常感谢您提供的任何帮助尝试查找dupe,但您需要获取对象的地址并将其分配给指针。您可以使用操作符& parr = &my_arr; 我建议你开始寻找另一个教程。这个有多个错误。i、 你会学到错
有人能告诉我这里出了什么问题吗?非常感谢您提供的任何帮助尝试查找dupe,但您需要获取对象的地址并将其分配给指针。您可以使用操作符&
parr = &my_arr;
我建议你开始寻找另一个教程。这个有多个错误。i、 你会学到错误的东西
- 对于C,检查
parr = my_arr;
p = my_arr;
左操作数的类型为int(*)[5]
,而右操作数的类型为int[5]
,并且没有从一种类型到另一种类型的隐式转换
如果要使用数组my_arr的地址作为一个整体对象初始化指针parr
,则必须写入
parr = &my_arr;
请注意这些printf调用中的文本
printf("Address of p = %u\n", p );
printf("Address of parr = %u\n", parr );
不正确,而且使用了不正确的转换说明符。如果变量p
和parr
,则函数不输出地址。他们试图在这些指针中输出存储的值
所以你必须写一些例子
printf("Address stored in p = %p\n", ( void * )p );
printf("Address stored in parr = %p\n", ( void * )parr );
在这两个调用中,将输出相同的值。除非它是
sizeof
或一元&
运算符的操作数,或者是用于初始化声明中字符数组的字符串文字,否则将转换类型为“N-element array ofT
”的表达式或“decay”,指向类型为“指向T
”的表达式,表达式的值将是数组第一个元素的地址
在声明中
parr = my_arr;
p = my_arr;
表达式my_arr
的类型为“int的五元素数组”(int[5]
)-由于它不是sizeof
或一元&
运算符的操作数,它“衰减”为“指向int
”(int*
)类型的表达式和my arr[0]的地址
被分配给p
,其类型也为int*
:
p = my_arr; // int * = int *, equivalent to p = &my_arr[0]
由于每个my\u arr[i]
都有类型int
,表达式和my\u arr[i]
都有类型int*
,因此
p = &my_arr[i]; // int * = int *
将p
设置为指向数组的第i
个元素
然而,在表达式中
parr = my_arr; // int (*)[5] = int *
parr
的类型为“指向int
的5元素数组的指针”,或int(*)[5]
。此类型与int*
不兼容。在这种情况下,我们需要使用my\u arr
上的一元&
运算符:
parr = &my_arr; // int (*)[5] = int (*)[5]
由于my_arr
是一元&
运算符的操作数,因此表达式不会衰减为int*
;相反,表达式的类型是“指向int
的5元素数组的指针”
现在,让我们将一个2d数组
my_2d_arr
声明为
int my_2d_arr[3][5];
在这种情况下,表达式my_2d_arr
具有类型“int的5元素数组的3元素数组”,并将衰减为类型“指向int的5元素数组的指针”。请记住,规则是“T的N元素数组”(T[N]
)=>“指向T的指针”(T*
)-在这种情况下,我们的T
是“int的5元素数组”。这样我们就可以写作了
parr = my_2d_arr; // int (*)[5] = int (*)[5]
它将按预期工作。my\u 2d\u arr[0]
的地址被分配给parr
。就像上面一样,这相当于写作
parr = &my_2d_arr[0];
表达式my_2d\u arr[0]
的类型为“int的5元素数组”(int[5]
)-由于它是和运算符的操作数,因此不会发生衰减,表达式的类型为“int
的5元素数组指针”(int(*)[5]
)
下面是一个方便的表格,总结了上述所有内容:
Expression Type Decays to Equivalent expression
---------- ---- --------- ---------------------
my_arr int [5] int * &my_arr[0]
&my_arr int (*)[5] n/a n/a
*my_arr int n/a my_arr[0]
my_arr[i] int n/a n/a
&my_arr[i] int * n/a n/a
my_2d_arr int [3][5] int (*)[5] &my_2d_arr[0]
&my_2d_arr int (*)[3][5] n/a n/a
*my_2d_arr int [5] int * my_2d_arr[0], &my_2d_arr[0][0]
my_2d_arr[i] int [5] int * &my_2d_arr[i][0]
*my_2d_arr[i] int n/a my_2d_arr[i][0]
&my_2d_arr[i] int (*)[5] n/a n/a
printf(“p的地址=%u\n”,p)代码>是未定义的行为。您需要使用%p
作为指针。(是的,在线教程有时/经常是错误的,而这一教程有多个错误。)可视代码表明问题在于这一行代码:parr=my_arr代码>错误消息:无法将int*类型的值分配给int(*)类型的实体[5]
@LukasPetrikas。看看这个链接:它解决了问题。。。谢谢,在这种情况下,我应该看看不同的指针教程!也许您有一些建议?@LukasPetrikas使用运算符检查我的编辑&,您正在使parr
访问指向数组指针的指针,而不是数组本身。@rdbo这只是教程的一个编码示例。但是,考虑使用它作为一个函数参数。您不想复制整个数组,因此请传递一个正确的指针。(也许还可以在我的答案中的链接中查找一些书籍,其中一些书籍中肯定有这方面的信息)(*parr)[0]=10
…别忘了括号!是的,指针就是这样工作的。(由于类型安全,C++甚至不允许您在C中做很多事情)。非常感谢