Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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
C 如何理解/可视化指向数组第一个索引的概念数组变量名?_C_Arrays - Fatal编程技术网

C 如何理解/可视化指向数组第一个索引的概念数组变量名?

C 如何理解/可视化指向数组第一个索引的概念数组变量名?,c,arrays,C,Arrays,在这里,系统将在堆栈中为数组分配相当于10个整数的内存。然而,我不认为有任何额外的内存分配给变量数组,我认为数组是人类理解和编码目的的助记符。如果是这种情况,printf在语句-printf%p\n,array;像接受指针变量一样接受它 随着阵列的尺寸不断增加,这种混淆变得更加明显 void main() { int array[10] = {1,2,3,4,5,6,7}; printf("%p\n",array); } 其中一个程序执行的输出为- int ma

在这里,系统将在堆栈中为数组分配相当于10个整数的内存。然而,我不认为有任何额外的内存分配给变量数组,我认为数组是人类理解和编码目的的助记符。如果是这种情况,printf在语句-printf%p\n,array;像接受指针变量一样接受它

随着阵列的尺寸不断增加,这种混淆变得更加明显

void main()
{
        int array[10] = {1,2,3,4,5,6,7};
        printf("%p\n",array);
}
其中一个程序执行的输出为-

int main()
{
        int matrix[2][4] = {{11,22,33,99},{44,55,66,110}};
        printf("%p\n", matrix);
        printf("%p\n", matrix+1);
        printf("%p\n", *(matrix+1));
}

因此,矩阵+1和*矩阵+1在间接寻址后都输出相同的虚拟内存地址。我理解为什么matrix+1地址是它显示的内容,但我不理解为什么*matrix+1即使在间接寻址之后也输出相同的地址

井数组不是指针。大多数情况下,sizeof、&operator、\u alignof等都是例外-它被转换为指向第一个元素的数组衰减指针

所以这里矩阵被转换成指向第一个元素的指针,当传递给printf时,它是int*[4]

现在逐一剖析,矩阵+1将指向2d数组的第二个元素,这是2d数组的第二个元素,这就是为什么它们相隔4倍

在第三种情况下,它们是相同的,因为矩阵+1是int*[4]类型,当你去引用它时,你会得到int[4]基本上与之前相同的地址

有一件事要记住——指针有两件事

它的价值 这是我喜欢的类型。 两个指针可能具有相同的值,但其类型可能不同。这里你也看到了

在以下章节中提到了它的衰变:-

除非它是sizeof运算符的操作数、_Alignof运算符或一元&运算符,或者是用于初始化数组的字符串文字,否则类型为“array of type”的表达式将转换为类型为“pointer to type”的表达式,该表达式指向数组对象的初始元素,而不是左值

此外,您打印地址的方式也不正确,这是您使用casting的情况之一

0x7ffd9ba44d10
0x7ffd9ba44d20
0x7ffd9ba44d20
让事情更清楚一点:-

矩阵基本上是一个对象int[2][4],它在您向int*[4]展示的情况下衰减。你可能想知道是什么使矩阵+1
指向数组的第二个元素-指针算法由它指向的对象表示。这里矩阵衰减为指向第一个元素int*[4]的指针,它将移动4 int。

井数组不是指针。大多数情况下,sizeof、&operator、\u alignof等都是例外-它被转换为指向第一个元素的数组衰减指针

所以这里矩阵被转换成指向第一个元素的指针,当传递给printf时,它是int*[4]

现在逐一剖析,矩阵+1将指向2d数组的第二个元素,这是2d数组的第二个元素,这就是为什么它们相隔4倍

在第三种情况下,它们是相同的,因为矩阵+1是int*[4]类型,当你去引用它时,你会得到int[4]基本上与之前相同的地址

有一件事要记住——指针有两件事

它的价值 这是我喜欢的类型。 两个指针可能具有相同的值,但其类型可能不同。这里你也看到了

在以下章节中提到了它的衰变:-

除非它是sizeof运算符的操作数、_Alignof运算符或一元&运算符,或者是用于初始化数组的字符串文字,否则类型为“array of type”的表达式将转换为类型为“pointer to type”的表达式,该表达式指向数组对象的初始元素,而不是左值

此外,您打印地址的方式也不正确,这是您使用casting的情况之一

0x7ffd9ba44d10
0x7ffd9ba44d20
0x7ffd9ba44d20
让事情更清楚一点:-

矩阵基本上是一个对象int[2][4],它在您向int*[4]展示的情况下衰减。你可能想知道是什么使矩阵+1
指向数组的第二个元素-指针算法由它指向的对象表示。此处,矩阵衰减为指向第一个元素int*[4]的指针,它将移动4 int。

可以理解衰减,但C标准使用转换后的术语。只有当与sizeof、_alignof和一元运算符&运算符一起使用时,才有转换的例外情况不,您很好,但您在使用C标准链接时做得很好,我想你会使用Converted如果没有为数组变量分配额外的空间-数组或矩阵,那么编译器如何执行所有指针算法?@DarshanL:老实说,我不明白你的问题-指针算法是由它指向的对象决定的。这就是未来。我不知道你在说哪个空间。试着去理解一点——一开始看起来有点困难,但规则是一样的。衰变是可以理解的,但C标准使用转换的术语。唯一例外
当与sizeof、_alignof和一元运算符&运算符一起使用时,可以使用ON进行转换。不,您很好,但是您在使用C标准链接时做得很好,我想你会使用Converted如果没有为数组变量分配额外的空间-数组或矩阵,那么编译器如何执行所有指针算法?@DarshanL:老实说,我不明白你的问题-指针算法是由它指向的对象决定的。这就是未来。我不知道你在说哪个空间。试着去理解一点——一开始似乎有点难,但规则是一样的。