- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图理解为什么指针的内存地址根据数据类型增加一定数量的字节。
以下代码创建一个由四个小整数组成的数组,然后逐字节迭代保存它们的内存地址。看起来整数存储在 0 字节中,随机值存储在字节 1-3 中:
int ia[] = {1, 3, 4, 7};
printf("Address of Int Array 0 is: %p\n", &ia[0]);
printf("Address of Int Array 1 is: %p\n", &ia[1]);
printf("Address of Int Array 2 is: %p\n", &ia[2]);
printf("Address of Int Array 3 is: %p\n", &ia[3]);
void *addr = (void *) &ia[0];
printf("\nAddress: %p\n", addr);
printf("Data: %d\n", *((int*) addr));
addr = addr+1;
printf("\nAddress: %p\n", addr);
printf("Data: %d\n", *((int*) addr));
addr = addr+1;
printf("\nAddress: %p\n", addr);
printf("Data: %d\n", *((int*) addr));
addr = addr+1;
printf("\nAddress: %p\n", addr);
printf("Data: %d\n", *((int*) addr));
addr = addr+1;
printf("\nAddress: %p\n", addr);
printf("Data: %d\n", *((int*) addr));
addr = addr+4;
printf("\nAddress: %p\n", addr);
printf("Data: %d\n", *((int*) addr));
输出是:
Address of Int Array 0 is: 0x7fff51b8ac30
Address of Int Array 1 is: 0x7fff51b8ac34
Address of Int Array 2 is: 0x7fff51b8ac38
Address of Int Array 3 is: 0x7fff51b8ac3c
Address: 0x7fff51b8ac30
Data: 1
Address: 0x7fff51b8ac31
Data: 50331648
Address: 0x7fff51b8ac32
Data: 196608
Address: 0x7fff51b8ac33
Data: 768
Address: 0x7fff51b8ac34
Data: 3
Address: 0x7fff51b8ac38
Data: 4
但是当我将一个非常大的整数放入数组时,会发生以下情况:
int ia[] = {2147483647, 3, 4, 7};
printf("Address of Int Array 0 is: %p\n", &ia[0]);
printf("Address of Int Array 1 is: %p\n", &ia[1]);
....
输出:
Address of Int Array 0 is: 0x7fff51d1fc30
Address of Int Array 1 is: 0x7fff51d1fc34
Address of Int Array 2 is: 0x7fff51d1fc38
Address of Int Array 3 is: 0x7fff51d1fc3c
Address: 0x7fff51d1fc30
Data: 2147483647
Address: 0x7fff51d1fc31
Data: 58720255
Address: 0x7fff51d1fc32
Data: 229375
Address: 0x7fff51d1fc33
Data: 895
Address: 0x7fff51d1fc34
Data: 3
Address: 0x7fff51d1fc38
Data: 4
我认为大整数可能(尽管不太可能)被分解为字节,每个内存地址一个四字节整数,与字节可寻址内存保持一致,这似乎是 C 中的表示形式。代码虽然第一个“内存地址”只是一个实际上保存四字节整数的构造。如果是这样的话,为什么 C 中递增的内存地址必须按数据类型的大小递增,当它看起来只是一个抽象时?为什么地址 1 不能返回 4 个字节,地址 1 不能返回 1 个字节,等等——特别是如果返回的数据小于机器的字大小?
最佳答案
I am trying to understand why memory addresses for pointers increment a certain number of bytes based on datatype.
因为这就是指针算术的工作原理;如果 p
是指向整数对象的指针 (int *p
),p+1
将指向下一个整数对象。如果 p
是指向 10 个元素的整数数组的指针 (int (*p)[10]
),则 p+1
将指向到下一个 10 个元素的整数数组。
p+1
始终计算出 p
后面的下一个对象的地址;如果对象的大小为 4 个字节,则 p+1
将 4 加到 p
的值上。如果对象的大小为 64 字节,则 p+1
将 64 添加到 p
的值上。
关于c - C 中的指针寻址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37768831/
我是一名优秀的程序员,十分优秀!