小白来学C语言之字符串与指针

初学C语言,指针的确是一个坎,但这又是基础,不得不学。真的学了好久,总是一知半解,也不怎么会做题,写下这篇博客,希望能帮助刚出门的小白,后续还有C语言指针例题以及详解。
不怎么会C语言数组与指针的可以先看下这个,绝对良心拒绝入坑。
C语言数组与指针,拒绝入坑https://blog.csdn.net/weixin_45755332/article/details/106851798

这里是有关指针的练习题,来自被谭浩强折磨的大学生

字符数组

定义:

char  arr[n];

初始化赋值:

char arr[5]={'a','b','c','d','e'};//注意,字符串类型的必须要加引号 '  '

也可以用ascll码来定义

	char arr[5]={65,66,'c','d','e'}; 
	printf("%c",arr[1]);  //  B 

引用

	char arr[5]={65,66,'c','d','e'};
	for (int i =0;i<5;i++){
		printf("%c ",arr[i]);//A B c d e
	}	

可以看出一般语法字符数组和其他类型的数组是一样的
下 面 来 看 看 不 同 的 地 方 {\color{Red}下面来看看不同的地方}

字符串

字符数组最后加了一个’\0’表示字符串的结束
字符串:就是一串字符,之前的数组是一个一个的组起来的。


输出时字符串可以一起输出,数组只能单个输出
注意这里是 %s

	char arr[ ]={'a','b','c','d','\0'};
	printf("%s",arr);	//abcd

当然还有更简单的,直接不用加\0,他自己给你加,(当然加也可以,他不会输出的)

char arr1[]="abcd";
printf("%s",arr1);	 //abcd

🐖意:如果你写的是arr[5],那么他之能保存四个字符因为最后一个 \0 他是存在的(没显示而已),也占一个字符位置。
上面两种类型的区别:他们开辟的内存空间是不一样的,
第一种是在数组中开辟了五个空间,分别存放五个字符,内存空间如左图。
第二种是将abcd放到一个只读区域,arr1开始并没有这些字符,arr1[]=“abcd”;是把abcd拷贝了一份给了arr1[ ]。
在这里插入图片描述在这里插入图片描述



当然也可以用for循环输出

		char arr1[]="abcdefg";
		for (int i =0;i<7;i++){
		printf("%c ",arr1[i]); //a b c d e f g
	}

string.h 进行赋值

想要对已定义的字符串进行更改,是不能直接改的,如下是错误的。当然如果不嫌麻烦可以一个一个的改,就是arr[0]="a“,arr[1]="b"这样。

char arr[10]="ewrgga";
arr[ ]="laoli";

为了更改方便我们引入一下函数库string.h
调用**strcpy()**函数。
注意不要越界也就是arr[10]之能copy9个字符

#include <stdio.h>
#include <string.h>
int main(){ 
	char arr[10]="ewrgga";
	strcpy(arr,"abcdefg");
	printf("%s  ",arr); //abcdefg
}

字符串与指针

字符串的访问

如我们定义了一个字符串

char string[]="I love China!";

其内存如图所示。
在这里插入图片描述
注意与数组和指针是一样的,string是字符串名,又是字符串的首地址

	char string[]="I love China!";
	printf("%s  ",string);		//源字符串   I love China!
	printf("%d  ",&string);   //字符串的首地址  	6487568
	printf("%c  ",*string);  //字符串首地址的内容	 I
	
	printf("%d  ",string+7);	//字符一个占一个字节,这里的string就代表首地址,加7就相当于往后移动了七个字节,到了C的地址的位置   6487575
	printf("%c  ",*(string+7)); // 打印下该地址的字符是啥  C
	printf("%c  ",string+7);  // 从C开始往后打印    China!

用字符指针访问

#include <stdio.h>
int main(){
	char *str="I love China!";
	printf("%s\n",str);
	str+=7;
	while(*str){
	printf("%s\n",str[0]);
		putchar(str[0]);
		str++;
	}
}

I love China!
China!

说明:

  1. 这里putchar就相当于printf,是逐个字符打印
  2. 这里*str是一个指针变量,上面那个代码中的string是一个常量,但都存放了字符串的首地址。变量可以自身++,而常量不可以
  3. while(str),意思就是str != 0,当 *str到了这个字符串最后 \0 时,*str就是0了;循环结束。

字符指针变量与字符数组

char *cp;与char str[10]

  • str由若干元素组成,每个元素放一个字符;而*cp中存放字符串首地址。指针变量只能存放地址,数组是有自己的空间的
  • 以下第一部分这样赋值是不合法的.想要赋值,如下二三部分,可以一个一个赋值或者初始化时赋值。
char str[20];
str= "I love China!";
********************************
str[0]='I';
str[1]= 'l';
...
...
********************************
char str[20] = "I love China!";
  • 而如下两种赋值都是可以的
char *cp;
cp = "I love China!";
*****************************
char *cp = "I love China!";
  • str是地址常量,cp是地址变量
  • cp接受键入字符串是,必须先开辟存储空间。如第一部分键入常量是可以的,第二部分用键入指针变量是不行的,因为没有开辟空间,所以可以用第三部分,先给指针开辟一个空间,再键入字符串。
char str[10];
scanf("%s",str);
**********************
char *cp;
scanf("%s",cp);
************************
char *cp,sre[10];
cp=str;
scanf("%s",cp);

字符指针变量使用注意事项

当字符指针执行指向字符串时,除了可以被赋值之外,与包含字符串的字符数组没有什么区别。

与上面那个相似,只是这个先把字符串赋值给了pstr,然后再strcpy给str。这与上面那个strcpy的主要区别就是,这个先定义了str[3],原本只能放两个字符的,现在能放多个了,也就是不受中括号里面的限制了

#include <stdio.h>
#include <string.h>
int main(){
	char str[3],*pstr;
	pstr="12345";
	strcpy(str,pstr);
	pstr=str;
	printf("%d",strlen(pstr)); //6
	printf("%d",strlen(str)); //6
}

毕竟是小白,从小白视角看可能不会太深,但像我一样的小白应该都能看懂。
这篇博客主要是写给新手的,希望大家都能学懂学好,嘿嘿,写的不好还望大佬勿喷。

  • 38
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猛男技术控

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值