我正在运行这个程序:
insertBefore
* pointChar和*(poinTer + 1)应该输出相同的结果,但我得到的输出是不同的。 * 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);
}
这里发生了什么?
答案 0 :(得分:3)
当您对指针执行+ 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);
}