我有一个示例程序如下:
int testPointer(int * intArray, int * ptr) {
printf("%i\n", intArray);
printf("%i\n", ptr);
printf("%lu\n", &intArray);
printf("%lu\n", &ptr);
return 0;
}
int main() {
int result = testPointer((int *) 0x1, (int *) 0x2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
典型的输出是:
1
2
3212962484
3212962480
Run Code Online (Sandbox Code Playgroud)
前两行总是一样的,我理解它们是如何产生的.第三行和第四行在每次运行时都有所不同,但第四行的值总是比第三行的值小四.我如何破译这些价值观?它们代表什么,为什么最后一行总是比第三行少四个?
它为您提供这些变量的地址,即它们的内存位置.
你有这些变量,它们是函数参数,但它们就像testPointer函数中的任何其他局部变量一样:
int testPointer(int * intArray, int * ptr)
^^^^^^ ^^^
Run Code Online (Sandbox Code Playgroud)
它们位于内存中的某个位置,您可以使用&运算符获取该位置的地址.这与做的类似
int i;
printf("%p\n", (void*)&i);
Run Code Online (Sandbox Code Playgroud)
它显示i变量的地址.
请注意,您应该使用%p来打印指针,因为printf("%p\n", (void*)&ptr);%i或%lu需要一个int或long参数,这可能与给定平台上的指针不兼容.
它们代表什么,为什么最后一行总是比第三行少四个
这是因为编译器已将这两个变量彼此相邻放在内存中,而在您的平台上,指针显然是4字节大.
而我们也可以从这个猜测是你的平台上,函数参数是放在栈上从左至右(第一intArray,然后ptr)如果您的系统上的堆栈内存向下增长(这是最常见的)