相同的 C 指针显示不同的值?
Same C pointer showing different values?
我是运行这个程序:
#include<stdio.h>
void main(){
int num = 1025;
int *poinTer = #
char *pointChar = poinTer+1;
*pointChar = 'A';
printf("Size of Integer: %d\n", sizeof(int));
printf("Address: %d, Value: %d\n", poinTer, *poinTer);
printf("Address: %d, Value: %c\n", poinTer+1, *(poinTer+1));
printf("Address: %d, Value: %c\n", pointChar, *pointChar);
}
*pointChar 和 *(pointer+1) 应该输出相同的结果,但我得到的输出是不同的。 *pointChar 未输出任何值:
Size of Integer: 4
Address: 1704004844, Value: 1025
Address: 1704004848, Value: A
Address: 1704004673, Value:
这里发生了什么?
当你对一个指针执行+ 1
时,它不一定将内存地址加1。它会增加sizeof(*ptr)
。
在这种情况下,poinTer + 1
等同于 (char*)poinTer + sizeof(int)
。这实际上使处理数组变得更加容易。
老式的 ptr[i]
是 *(ptr + i)
的语法糖。因此,如果您有一个包含 10 个整数的数组,ptr[4]
将指向第 5 个元素,而不是距基地址 4 个字节(因为整数通常为 4 或 8 个字节)。
所以你实际做的是:
- 在栈上创建一个
int
(num
)并赋值1025
- 在栈上创建了一个
int*
(poinTer
)并分配给它num
的内存地址
- 将指针增加
sizeof(int)
(无意中指向不同的内存地址),然后将其转换为 char*
并将其分配给新指针。
- 为指向此新内存地址的字节分配值
65
('A'
)。
这可能是您想要做的:
#include<stdio.h>
void main(){
int num = 1025;
int *poinTer = #
char *pointChar = (char*)poinTer + 1;
*pointChar = 'A';
printf("Size of Integer: %d\n", sizeof(int));
printf("Address: %d, Value: %d\n", poinTer, *poinTer);
printf("Address: %d, Value: %c\n", (char*)poinTer + 1, *((char*)poinTer+1));
printf("Address: %d, Value: %c\n", pointChar, *pointChar);
}
我是运行这个程序:
#include<stdio.h>
void main(){
int num = 1025;
int *poinTer = #
char *pointChar = poinTer+1;
*pointChar = 'A';
printf("Size of Integer: %d\n", sizeof(int));
printf("Address: %d, Value: %d\n", poinTer, *poinTer);
printf("Address: %d, Value: %c\n", poinTer+1, *(poinTer+1));
printf("Address: %d, Value: %c\n", pointChar, *pointChar);
}
*pointChar 和 *(pointer+1) 应该输出相同的结果,但我得到的输出是不同的。 *pointChar 未输出任何值:
Size of Integer: 4
Address: 1704004844, Value: 1025
Address: 1704004848, Value: A
Address: 1704004673, Value:
这里发生了什么?
当你对一个指针执行+ 1
时,它不一定将内存地址加1。它会增加sizeof(*ptr)
。
在这种情况下,poinTer + 1
等同于 (char*)poinTer + sizeof(int)
。这实际上使处理数组变得更加容易。
老式的 ptr[i]
是 *(ptr + i)
的语法糖。因此,如果您有一个包含 10 个整数的数组,ptr[4]
将指向第 5 个元素,而不是距基地址 4 个字节(因为整数通常为 4 或 8 个字节)。
所以你实际做的是:
- 在栈上创建一个
int
(num
)并赋值1025
- 在栈上创建了一个
int*
(poinTer
)并分配给它num
的内存地址
- 将指针增加
sizeof(int)
(无意中指向不同的内存地址),然后将其转换为char*
并将其分配给新指针。 - 为指向此新内存地址的字节分配值
65
('A'
)。
这可能是您想要做的:
#include<stdio.h>
void main(){
int num = 1025;
int *poinTer = #
char *pointChar = (char*)poinTer + 1;
*pointChar = 'A';
printf("Size of Integer: %d\n", sizeof(int));
printf("Address: %d, Value: %d\n", poinTer, *poinTer);
printf("Address: %d, Value: %c\n", (char*)poinTer + 1, *((char*)poinTer+1));
printf("Address: %d, Value: %c\n", pointChar, *pointChar);
}