指针与字符串搞得我有点混乱所以自己梳理 一下
gets()与puts()函数
puts(字符数组)函数:直接输出字符串
#include<stdio.h>
#include<windows.h>
int main()
{
char *arr;
arr="hello world";
puts(arr);
puts("chi\na");
printf("%s\n",arr);
system("pause");
}
直接输入字符数组名也可以
中间可以包括转义字符
结尾自动换行
gets(字符数组)函数:从键盘得到一个字符串并给到字符数组,并且得到一个函数值,该函数值是字符数组的起始地址
#include <stdio.h>
int main()
{
char str[50];
printf("请输入一个字符串:");
gets(str);
printf("您输入的字符串是:%s", str);
char str[]="china";
char *a=gets(str);
printf("%p\n",a);
printf("%p\n",a+1);
return(0);
}
#------运行结果---------
请输入一个字符串:runoob
您输入的字符串是:runoob
hhhh
000000000061FE0A
000000000061FE0B
gets()不能用于指针变量
通过指针引用字符串
#include<stdio.h>
#include<windows.h>
int main()
{
char str[10];
char *arr;
arr="hello world";
char *a=gets(str);//gets()返回的是首地址
printf("%p\n",a);
printf("%p\n",a+1);
puts(arr);
puts("chi\na");
printf("%s\n",arr);
printf("%s\n",str);
system("pause");
}
#--------运行结果---------
hhh
000000000061FE06
000000000061FE07
hello world
chi
a
hello world
hhh
通过字符数组名或者字符指针变量可以输出一整个字符串,因为他会自动将地址加1进行输出,但数组则不行,需要逐个输出
字符串赋值给指针变量也是相当于数组,将首地址赋值给指针,因为指针变量只能用来存储地址,这点是很重要的
使用字符指针变量与字符数组的区别
- 字符数组由若干元素组成,每个元素放一个字符,而字符指针变量中存放的是地址
- 可以对字符指针变量赋值,但不可以对数组名赋值,比如上面对指针变量的赋值
char str[10];
str[0]="j"; //合法
str="hello world"; //非法,因为数组名的本质是一个地址,不能被赋值
- 编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元
//所以该写法是危险的
char *a;
scanf("%s",a);
因为在编译时a已经分配了存储单元,但a中的存储单元是一个不确定的值,可能指向内存中的未知区域,现在就相当于向该未知区域输入字符串,可能破坏系统造成严重后果,所以要避免这种写法
- 指针变量的值是可以改变的,因为其存放的是地址,加1就代表指向下一个字符的地址;而字符数组名代表的是一个固定的值,即数组元素的首地址,所以是不能改变的
- 字符数组的元素是可以改变的,但字符指针变量指向的字符串常量内容则不可以改变
char a[]="hello";
char *b="hello";
a[2]='r';//可以改变
b[2]='r';//不可以改变
- 可以用指针变量或者字符数组代替printf()中的格式字符串
char *format;
format="a=%d,b=%d";
printf(format,a,b);
//相当于printf("a=%d,b=%d",a,b);
//同理字符数组也能实现