gpt4 book ai didi

c - 为什么我不能打印这个指针的值?

转载 作者:太空狗 更新时间:2023-10-29 17:19:32 25 4
gpt4 key购买 nike

正在关注 yesterday's question ,我用指针做了更多的实验。特别是 int (*) [n] 类型的指针

这是我写的一些代码:

#include <stdio.h>

int main(void)
{
int a[5] = {1, 2, 3, 4, 5};

int (*p) [5] = &a;
int *q = a;

printf("\t\t\t\t\tp\t\tq\n\n");
printf("Original Pointers: \t%20d%20d", p, q);
printf("\n\n");
printf("Incremented Pointers:\t%20d%20d", p+1, q+1);
printf("\n\n");
printf("Pointer values: %20d%20d", *p, *q);
printf("\n\n");

return 0;
}

这是它的输出:

                                    p                 q

Original Pointers: 132021776 132021776

Incremented Pointers: 132021796 132021780

Pointer values: 132021776 1
  • 指针p,递增时跳转20。这是因为它是 int(*)[5] 类型的指针,因此在数组中跳转 sizeof(int) * number of columns 吗?

  • pq 具有相同的值(但类型不同),但是当使用 p 的间接运算符时,我没有得到数组第一个单元格的值,而是打印出 p 本身的值。这是为什么?

  • 当我使用int *p = &a时,它会抛出一个警告(因为指针类型不同,但后来当我使用带p的间接运算符时,我可以得到它打印数组中第一个单元格的值。这是因为当我将 &a 分配给 p 时,它转换了 &arr 的类型(即int ( * ) [5]) 到类型int *,然后赋值给p?

最佳答案

The pointer p, jumps by 20 when incremented. Is this because it's a pointer of type int(*)[5], and therefore jumps by sizeof(int) * number of columns in the array ?

是的。

Both p and q have the same values (but different types), and yet when using the indirection operator with p, I don't get the value at the first cell of the array, instead I get the value OF p printed out. Why is this ?

p 指向一个数组,因此使用 *p,您可以访问该数组。在没有索引的情况下计算一个数组会让你得到一个指向它第一个元素的指针。您的 *p 在此处被评估为类型 int *

附带说明一下,* 通常称为取消引用 运算符。使用不同的术语可能会让其他人感到困惑。

When I use int *p = &a, it throws up a warning (because of different types of pointers, but later when I use the indirection operator with p, I can get it to print the value of the first cell in the array. Is this because when I assign &a to p, it CONVERTS the type of &arr (which is int ( * ) [5]) to the type int *, and then assigns to p ?

我在这里有一个答案,将其误读为类似 int *q = (int *)p 的东西,它会创建一个别名 指针和可能的未定义行为,所以留下这个这里有一些小提示,以防万一有人得到这个的想法。但是你在这个问题中的建议只是一个无效的分配。 Lundin's answer对此有完整的解释。


你的代码有更多问题,你打印的指针应该是这样的:

printf("Original Pointers: \t%20p%20p", (void *)p, (void *)q);

指针可以大于 int。需要转换为 void * 是因为 printf() 是一个可变参数函数。如果它被声明为采用 void *,则转换将是隐式的,但事实并非如此,您必须自己进行。

关于c - 为什么我不能打印这个指针的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44538053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com