C - 字符串

C语言–备忘



一、字符串与指针

  1. 定义一个字符指针变量,并且指向字符串,本质是指向这个字符串的首地址,第0个字符的首地址;
    在这里插入图片描述
  2. 不能通过 字符指针变量 修改字符串的值,为常量指针;

char a[ ]=“ahdkasd”,则 p指向a,p=a, p[ i ]=a[ i ] 等价 =====》字符串和指针等价
char *p=“ahdkasd”;

char *p="ahdkasd";
printf("%s\n",p);
*(p+2)='D';//GCC报错,常量内存区域无法做到修改内存

二、字符串和数组

  1. 字符串数组的两种写法:
//写法一:
char a[]="abc";//无需添加\0,GCC帮忙追加'\0'
a[2]='B';//数组来修改
*(a+2)='B';//通过字符指针修改,两者等价,可以修改

//写法二:
char a[]={'a','b','c','\0'};//*****不加"\0",当成字符数组;若加"\0",既当成字符串,也当成
  1. 数组与字符串使用说明:
#include <stdio.h>
int main(void)
{	
    //形式1
    char a[]="abcd";
    *(a+1)='B';//可修改
    printf("%s\n",a);//打印此数组,首地址=整个数组
    printf("sizeof(b)=%d\n",sizeof(a));//5,'\0'也算一个字符
    return 0;
    
    //形式2
    char a[]={'a','b','c','d','\0'};
    printf("%s\n",a);//打印字符串
    a[1]='B';//可修改
    printf("%s",a);
    
} 
  1. 实现strcmp:
int my_strcmp(const char *str1,const char *str2)
{

//我的写法
    for(;*str1 !='\0';str1++,str2++)
    {
        if (*str1 != *str2){
        	return  *str1-*str2;
         }            
    } 
    return *str1-*str2;   
}

三、字符指针数组

  1. 明确:[ ] 运算符的计算步骤:1. 先求地址 2. 后取值;
  2. 指针数组:数组中的每一个元素都是地址,不能是普通的数据;
  3. 指针数组语法格式:
    数据类型 *数组名[ 元素个数]={地址列表};
    元素个数=sizeof(数组名)/sizeof(数组名[0]);
int a=10,b=20,c=30;
int *p[3]={&a,&b,&c};//此 int 为对应地址指向的内存空间的数据类型,指针无类型

单个查看地址
p[0]=&a=*(p+0);//p对应的为地址数组的首地址(下下层,类似 0x800 ),解运算符得到地址
p[1]=&b=*(p+1);
p[2]=&c=*(p+2);

单个实现指针寻址
*p[0]=**(p+0)=10;//两次取解地址符
*p[1]=**(p+1)=20;
*p[2]=**(p+2)=30;

//使用for循环实现指针寻址
int len=sizeof(p)/sizeof(p[0]);
for(int i=0;i<len;i++)
{
    printf("%d %d",*p[i],**(p+i));
}
    printf("\n");
return 0;

四、字符串指针数组

含义:特殊的指针数组,每个元素是一个字符串的首地址;

  1. 等价关系
char *p[]={"abc","efg"};
// 第0各元素是字符串"abc"的首地址,第1个元素是字符串"efg"的首地址
// 等价于
char *p1="abc"; // 常量指针,把字符串的首地址给到p1
char *p2="efg";
char  *p[]={p1,p2};// p1、p2分别为字符串"abc","efg"的首地址,等价于字符串 

// 结果为:*************重要*************
p[0]= p1 ="abc"; // a[]="abc",首地址等价于数组。a=p
p[1]= p2 ="efg"; // "efg"可以代表首地址
  1. 常见错误
int main(void)
{
    形式一:
    char *p[]={"abc","efg"};//相当于常量指针,指定内存区域无法修改
    int length =sizeof(p)/sizeof(p[0]);
    //读写
    for(int i=0;i<len;i++){
        printf("%s %s \n",p[i],*(p+i));  //两步走  
    } 
    //不可修改,常量
    *(p[0]+1) ='B';//GCC报错,常量内存区域无法做到修改内存
    *(p[1]+2) ='B';//GCC报错,常量内存区域无法做到修改内存
    
    形式二:
    char *p1="abc",*p="efg";
    char *p3[]={p1,p2};
    //读查看
    for(int i=0;i<len;i++){
        printf("%s %s\n",p3[i],*(p3+i));   //p3+i,然后*解运算符 
    }
    return 0;
}

总结

  1. 本章节完整讲述字符串指针用法,复习备用;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值