c - 多维数组中的指针

标签 c pointers multidimensional-array

这个疑问是关于二维数组中的指针。

这里的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/

相关文章:

java - 在运行时用 Java 创建 n 维数组

c - 为什么 fseek 和 fputc 在我的程序中不起作用?

c - C中的结构和指针

我可以从数组的某个位置重新分配吗?

c - strcpy 函数如何同时接受地址和字符串常量?

c++ - 数组问题 : Stack around the variable 'arr' was corrupted

c - 对二维数组进行排序,使最大的元素位于主对角线上

c - 为什么这个程序在输入为1时运行?

C 错误,需要帮助

c - 定义类的 "Expression must have class type"错误