Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 指向数组和二维数组的指针_Arrays_C_Pointers - Fatal编程技术网

Arrays 指向数组和二维数组的指针

Arrays 指向数组和二维数组的指针,arrays,c,pointers,Arrays,C,Pointers,我正在学习指针以及它们通常是如何工作的。我在网上找到了一些示例代码: 也许有人能帮我理解这里的问题是什么?提供的示例代码是否错误 另外,我正在从以下视频中学习: 如果你转到1:48:52,你会看到,他建议了一种类似的方法来声明一个指针,我在编译时也遇到了问题 有人能告诉我这里出了什么问题吗?非常感谢您提供的任何帮助尝试查找dupe,但您需要获取对象的地址并将其分配给指针。您可以使用操作符& parr = &my_arr; 我建议你开始寻找另一个教程。这个有多个错误。i、 你会学到错

我正在学习指针以及它们通常是如何工作的。我在网上找到了一些示例代码:

也许有人能帮我理解这里的问题是什么?提供的示例代码是否错误

另外,我正在从以下视频中学习:

如果你转到1:48:52,你会看到,他建议了一种类似的方法来声明一个指针,我在编译时也遇到了问题


有人能告诉我这里出了什么问题吗?非常感谢您提供的任何帮助

尝试查找dupe,但您需要获取对象的地址并将其分配给指针。您可以使用操作符&

parr = &my_arr;
我建议你开始寻找另一个教程。这个有多个错误。i、 你会学到错误的东西

  • 对于C,检查
  • 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 of
T
”的表达式或“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中做很多事情)。非常感谢