c - C中的指针,指向字符指针的整数指针

标签 c pointers

当我运行这段代码时:

int arr[3] = {2,3,4};
char *p;
p = (char*)arr;
printf("%d", *p);
p = p+1;
printf("%d", *p);

输出是 2 和 0。第二个结果有点困惑。有人可以解释为什么会这样吗?

最佳答案

让我们分解一下:

int arr[3] = {2,3,4};

创建一个包含 3 个整数的数组。假设您的系统是 32 位小端字节序,这就是它在内存中的样子:

02 00 00 00 03 00 00 00 04 00 00 00

char *p; p = (char*)arr;

p 现在指向 arr 但它是指向 char* 的指针。换句话说,p 指向 02

printf("%d", *p);

您正在将 p 引用的位置打印为 int。因此,当您取消引用 p(通过编写*p)时,您正在访问char(因为p char*) 类型,由 p 引用。这是 02

p = p+1;

p 现在指向 02 之后的 00,因为 pchar*。所以当你加 1 时,它将在内存中移动 1 * sizeof(char) = 1 * 1 = 1 字节。

printf("%d", *p);

您正在将 p 引用的位置打印为 int。因此,当您取消引用 p(通过编写*p)时,您正在访问char(因为p char*) 类型,由 p 引用。即 00

如果你想打印 3 而不是 0 你必须将指针类型更改为 int* 而不是 char* ,使指针在内存中移动 1 * sizeof(int) = 1 * 4 = 4 个字节。

关于c - C中的指针,指向字符指针的整数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687754/

相关文章:

c++ - 只有当我们有多个线程时才会出现不可重入问题吗?

c++ - C/C++ 宏,用于在不使用三元运算符的情况下查找两个数的最大值

.net - 托管对象,为什么不会(^)。编译?

c - 不理解指针

c - OpenGL - 屏幕上没有任何内容

c - 是否可以在 C 中重复使用 opendir?

java - 在客户端/服务器应用程序中阻止 c 中的读取函数

c - C 如何计算这个表达式? C指针

c++ - C++候选函数不可行: no known conversion from 'int' to 'int *' for 1st argument; take the address of the argument with &

c++ - 如何返回指针 vector (和所有权)C++11