C语言–备忘
一、字符串与指针
- 定义一个字符指针变量,并且指向字符串,本质是指向这个字符串的首地址,第0个字符的首地址;
- 不能通过 字符指针变量 修改字符串的值,为常量指针;
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报错,常量内存区域无法做到修改内存
二、字符串和数组
- 字符串数组的两种写法:
//写法一:
char a[]="abc";//无需添加\0,GCC帮忙追加'\0'
a[2]='B';//数组来修改
*(a+2)='B';//通过字符指针修改,两者等价,可以修改
//写法二:
char a[]={'a','b','c','\0'};//*****不加"\0",当成字符数组;若加"\0",既当成字符串,也当成
- 数组与字符串使用说明:
#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);
}
- 实现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. 先求地址 2. 后取值;
- 指针数组:数组中的每一个元素都是地址,不能是普通的数据;
- 指针数组语法格式:
数据类型 *数组名[ 元素个数]={地址列表};
元素个数=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;
四、字符串指针数组
含义:特殊的指针数组,每个元素是一个字符串的首地址;
- 等价关系
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"可以代表首地址
- 常见错误
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;
}
总结
- 本章节完整讲述字符串指针用法,复习备用;