这几天学了指针与地址之后,突发奇想。
1 #include <stdio.h> 2 int main() 3 { 4 int a,b,*pa,*pb; 5 pa = &a; 6 pb = &b; 7 scanf("%d %d",pa,pb); 8 printf("%d %d\n",a,b); 9 return 0; 10 }
既然scanf中&a与&b可以用指向它们地址的指针pa与pb来代替,那么是否可以通过查询变量a与b的地址,直接把a与b的地址写上来给a与b进行赋值呢?
于是我就通过:
printf("&a=%p\n",&a); printf("&b=%p\n",&b);
来获得了a与b的地址,分别为&a=0028FF0C与&b=0028FF08。
可是当我输入这样的代码的时候
scanf("%d %d",0028ff0C,0028FF08);
编译器报错,编译无法通过。
之后就一直在想,无论是&a还是pa,提供给编译器的的确是0028FF0C这样的一串数字啊,为什么我把它码出来就不行了呢?
难不成其中涉及到一些编译原理的问题。
之后我上网查scanf的函数原型,也没有找到相关答案能解决我的疑问。
偶然间想起,地址是一串16进制的数字,而在大多数IDE中,默认你的数字是10进制的,而如果想要表达16进制的数字,则需要在数字前加上0x才行。
于是我就把代码改成如下格式:
1 #include <stdio.h> 2 int main() 3 { 4 int a,b; 5 scanf("%d %d",0x0028FF0C,0x0028FF08); 6 printf("%d %d\n",a,b); 7 return 0; 8 }
虽然编译器还是给出了一大串的warning,好在总算没有error,程序可以顺利运行,结果也和预期一致。
总结:
scanf函数中,后面的地址表中,可以写直接对变量的取值(&a),也可以写存有该变量地址的指针(pa),也可以直接祭出变量的地址(0x0028FF0C)。
注:直接写地址的话,16进制数中的英文字母无视大小写。
时间: 2024-11-13 06:54:27