我是靠谱客的博主 怡然小鸭子,最近开发中收集的这篇文章主要介绍【经典】关于指针赋值、输出报错的那些事,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天看到一道很有意思的题,本来想回答的但是还是慢了点,唉。。。
可是这里面涉及到的点真的很容易出错,一不小心就掉坑了。。。

指针赋值报错

各位小伙伴们看看下面这几句代码是否存在问题?

#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]));
}

最后

以上就是怡然小鸭子为你收集整理的【经典】关于指针赋值、输出报错的那些事的全部内容,希望文章能够帮你解决【经典】关于指针赋值、输出报错的那些事所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部