代码1
#include<stdio.h>
int main()
{
char i = 'a';
char *arr=&i;
scanf("%c",arr);
printf("%c",*arr);
return(0);
}
代码2
#include<stdio.h>
int main()
{
char *arr;
scanf("%c",arr);
printf("%c",*arr);
return(0);
}
代码1和代码2实现的功能是一样的吗,都可以运行吗?
代码2错误,为什么?
为什么不能这么操作?
大家首先来看一下,scanf函数
scanf(“格式控制字符串”, 地址表列);
scanf("%d%d",&a,&b);
例如:&a、&b分别表示变量a和变量b的地址。
这个地址就是编译系统在内存中给a、b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。
应该把变量的值和变量的地址这两个不同的概念区别开来。
变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。
所以问题出在哪?
在进行代码2的时候 scanf("%c",arr);//中arr有地址吗或者有系统编译的地址吗?
#include<stdio.h>
int main()
{
char *arr;
scanf("%c",arr);
printf("%c",*arr);
return(0);
}
我们来验证一下。
#include<stdio.h>
int main()
{
// char i = 'a';
int *arr;
// scanf("%c",arr);
printf("%d",arr);
return(0);
}
很可惜没有地址,那scanf能有效运行吗,意思是scanf在输入带输入字符的时候,能把想要输入的数据,给到地址吗,不能!所以代码2运行错误。
定义指针的时候,需要我们注意,指针变量的值。
指针是一个地址,而指针变量是存放地址的变量。