指针和字符数组学习


指针与字符串搞得我有点混乱所以自己梳理 一下

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进行输出,但数组则不行,需要逐个输出
字符串赋值给指针变量也是相当于数组,将首地址赋值给指针,因为指针变量只能用来存储地址,这点是很重要的

使用字符指针变量与字符数组的区别

  1. 字符数组由若干元素组成,每个元素放一个字符,而字符指针变量中存放的是地址
  2. 可以对字符指针变量赋值,但不可以对数组名赋值,比如上面对指针变量的赋值
char str[10];
str[0]="j"; //合法
str="hello world"; //非法,因为数组名的本质是一个地址,不能被赋值
  1. 编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元
//所以该写法是危险的
char *a;
scanf("%s",a);

因为在编译时a已经分配了存储单元,但a中的存储单元是一个不确定的值,可能指向内存中的未知区域,现在就相当于向该未知区域输入字符串,可能破坏系统造成严重后果,所以要避免这种写法

  1. 指针变量的值是可以改变的,因为其存放的是地址,加1就代表指向下一个字符的地址;而字符数组名代表的是一个固定的值,即数组元素的首地址,所以是不能改变的
  2. 字符数组的元素是可以改变的,但字符指针变量指向的字符串常量内容则不可以改变
char a[]="hello";
char *b="hello";
a[2]='r';//可以改变
b[2]='r';//不可以改变
  1. 可以用指针变量或者字符数组代替printf()中的格式字符串
char *format;
format="a=%d,b=%d";
printf(format,a,b);
//相当于printf("a=%d,b=%d",a,b);
//同理字符数组也能实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值