概述
今天看到一道很有意思的题,本来想回答的但是还是慢了点,唉。。。
可是这里面涉及到的点真的很容易出错,一不小心就掉坑了。。。
指针赋值报错
各位小伙伴们看看下面这几句代码是否存在问题?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *p;
scanf("%s",p);
printf("%s",*p);
}
是不是乍一看,毫无问题啊,嘿嘿,可是它偏偏就是会出错。。。
这是为什么呢?
我感觉没毛病啊,scanf中放的指针p也可以代表地址,printf中*P输出的也是指针p所对的内容。。。
可真的是这样吗?
再仔细回头debug??
相信聪明的你,看到这里应该会幡然醒悟:p指针所指的地址到底是哪里?不知道!!! 其实啊,在我们每次新定义指针变量的时候,它都是默认指向不确定的地址的,因为在指针使用前,我们必须给它指定指向。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *p;
char str[30];
p = str; //指定p的指向
scanf("%s",p);
printf("%s",*p);
}
刚刚说程序出错是因为没用给指针p指定指向,才报错的,那么现在我让它指向于str字符串的首地址,这样应该不会报错的了吧。
/满怀信心地去运行一波/
啪——
程序又出现问题了——还是不能正常输出。。。
这是什么原因呢??
指针输出报错:
嘿嘿!!
其实是printf语句出现问题了,导致不能正常输出。
在用printf语句打印%s的时候,printf语句要求提供字符串首地址。这是printf所规定的,也就是看到%s,printf就要求指针变量,而不是我们逻辑上认为的指针里面所存储的内容。
所以用printf("%s",p);而不是printf("%s",*p); 这一点必须记住。如果用%c,想输出里面的内容就可以按照正常的指针概念,用 *p了。
其实c语言没有string类型。c语言的字符串只是用char数组代替的。那么%s字符串如何工作?它会从所给指针指向的位置开始,逐字符的打印输出,直到遇到“/n”或者“/0”。所以%s需要的只是一个指针值。(或者说数组第一个值的内存地址)读取了第一个值后,它会跳到后面的位置继续读取,这建立在你传给它的值是指针的前提上。如果你用了 * , 结果只得到了第一个字符而没有指针(*表示取出指针所指位置保存的值),程序不知道后续字符的储存位置,它就无法寻找了。
**如果改成下面这样子,就一点毛病都没有了:**
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *p;
char str[30];
p = str; //指定p的指向
scanf("%s",p);
printf("%s",p);
}
或者:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char * num[30]; //新定义的指针都是指向一个不确定的值,
//在使用之前必须要给予它明确的指向
for(int i=0;i<=2;i++) {
num[i] = (char*)malloc(30*sizeof(char));
scanf("%s",num[i]);
}
for(int j=0;j<=2;j++)
printf("%s",(num[1]));
}
最后
以上就是怡然小鸭子为你收集整理的【经典】关于指针赋值、输出报错的那些事的全部内容,希望文章能够帮你解决【经典】关于指针赋值、输出报错的那些事所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复