这个疑问是关于二维数组中的指针。
这里的ptr
是一个指针,i
代表行,j
代表列。
我在大学里被教导如果我使用 (ptr+i)
那么指针将指向第 i
行中的第一个元素。如果我使用 *(ptr+i)
那么指针将打印第 i
行中的第一个元素。如果我使用 (*(ptr+i)+j)
那么它是一个指向 i
行中的 j
元素的指针。如果我使用 * ( *(ptr+i)+j))
那么它指的是在 i
行和 j
列中可用的内容.但是,当我尝试基于这些的程序时,它完全没有相似之处。我在它们旁边写下了各自 printf
的输出。最后一个 printf
显示错误。
void main()
{
int c[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int *ptr = c;
printf("\n%u", ptr); //713549104
printf("\npointing to 2nd row=%u", ptr + 2); //713549112
printf("\n1st element in 2nd row=%u", *(ptr + 2)); // 3
printf("\n3rd element in 2nd row=%u", (*(ptr + 2) + 3)); //OUTPUT 6
printf("\ncontent available in 2nd row, 3rd column=%u", *(*(ptr + 2) + 3)); //error
}
是否有其他方法可以让二维数组中的指针指向列或行中的特定元素并打印其值。我理解的正常方式是,如果我写 (ptr+1)
那么这应该意味着增加 4 个字节。但是我不明白为什么我的先生写的是增加排数的意思。与其他 printf
类似。
最佳答案
您的基本假设是错误的。因为 ptr
被声明为 int *
,而不是 int[4] *
,所以 ptr + i
不是指针到第 i 行,它是指向数组中按行优先顺序排列的第 i 个元素的指针。
要获得指向第 i 行第 j 个元素的指针,您需要使用 ptr + (i*4) + j
(并从每个坐标中减去 1,因为数组索引是从零开始的).这整个事情需要用 *
取消引用:
printf("\n1st element in 2nd row=%u", *(ptr + (2*4) + 0));
printf("\n3rd element in 2nd row=%u", *(ptr + (2*4) + 2));
在您的代码中,(*(ptr + 2) + 3)
只是将 3
添加到在地址 ptr + 2
处找到的值>。 + 3
不适用于地址,因为它在 *
运算符的参数之外。
关于c - 多维数组中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47044529/