关于scanf函数中取地址的问题

  这几天学了指针与地址之后,突发奇想。

 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

关于scanf函数中取地址的问题的相关文章

scanf()函数中*的用法

*在scanf函数中提供完全不同的服务,当把它放在%和说明符字母之间时,它使函数跳过相应的输入项目. 实例程序: /*scanf()函数中*的用法:如果程序要读取一个文件中某个特定的列(该文件中的数据以统一的列排列时,那么该功能将非常有用)*/ #include <stdio.h> int main() { int n; printf("please input four numbers:\n"); scanf("%*d %*d %*d %d",&

承接上篇scanf函数何时取&amp;问题

上篇已经比较清楚的强调了 scanf函数后面接的是地址,不是变量. 如果接收的本来就是地址就不需要加&符,如果接收的是变量,则需要在前面加上&符. 所以接下来需要搞明白的是什么类型的是地址. 目前我们学到的地址有两个: 1.数组的首地址就是就是地址名.例如int a[10]: a就是地址. 2.指针,p是指针本身,*p才是指针这个空间(房间中,p有自己的房间号,*p是p的房间里面存的一个房间号)中的存储的地址. 原文地址:https://www.cnblogs.com/yhc99/p/90

C/C++ scanf函数中%s和%c的简单区别

首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf,getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取).另外特别注意键盘上敲入回车实际为"\r\n",但存储到缓冲区时候会舍弃'\r'而只存储\n.例如我们敲入字符"12345回车",缓冲区内存储的为"12345\n". 文章中"_"代表空格 代码: char *s; scanf("%s&qu

函数名&amp;函数名取地址

有时看到如下的代码: /*****************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> void test() { printf("123456\n"); } int main(int argc, char *argv[]) { printf("0x%x\n",test); printf("0x%x\n&q

scanf函数(初学者)

scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中. 1.scanf函数的一般形式:scanf函数是一个标准的库函数,它的函数原型在头文件"stdio.h"中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件. scanf函数的一般形式为:scanf("格式控制字符串",地址列表): 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串.地址列表中给

scanf()函数

函数名: scanf 功  能: 执行格式化输入 用  法: int scanf(char *format[,argument,...]); scanf("格式控制字符串",输入参数一,输入参数二) 格式控制字符串表示输入的格式:(int型用%d,float用%f,double型用%lf) %d 十进制有符号整数  %u 十进制无符号整数  %f 浮点数  %s 字符串  %c 单个字符  %p 指针的值  %e 指数形式的浮点数  %x, %X 无符号以十六进制表示的整数  %0 无

scanf函数详细讲解

(1)简介: scanf函数是c语言当中非常重要的格式化输入函数 其函数原型为:int scanf(const char *format, ...); 其函数返回值:成功格式化解析的个数 其调用格式为:scanf("<格式化字符串>", <参量表>); (2)转换说明: 转换格式为:%[*][宽度][类型长度]类型 除了最后的类型之外都是可选的字段 转换修饰符 修饰符 意义 * 滞后赋值:示例:"%*d" digit(s) z最大字段宽度:在

scanf函数简单讲解

在C语言中,scanf函数用来接收控制台输入的数据,包括数字.字符.汉字.字母等.其首先将从键盘或触摸屏接收到的数据存放到内存中,然后严格按照scanf函数中""的内容将相应的数据存到""后面的地址中(如&a是将相应的数据存到以&a为地址的内存中).scanf函数中的""内容分为非格式控制符(如符号等)和格式控制符(如%d.%c.%f.%lf等).非格式控制符必须原样输入(\n的输入不是按Enter键,而是输入\n),格式控制符会

终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ---------------------------------------------------------------------------------------------------------------- 在学习Delphi的时候,一个很好的建议是和C/C++去类比着学习,从指针,到内存管理,到数组,到面向对象……各个方面,都是有很多可以相似和或者也有不同的方,类比着学习,一