指针与字符串_基础知识

一、char类型的长度为1,而字符串字面量的长度为4

 

printf("%d\n", sizeof(char));//1
printf("%d\n", sizeof('a'));//4


二、字符串字面量看作常量,无法修改字符串。

#include<stdio.h>
int main()
{
	char *tabHeader = "Sound";
	*tabHeader = 'L';
	printf("%s\n", tabHeader);
	return 0;
}

上面程序运行报错。为了自己好,不要去修改字符串常量值,不然你是在给自己找麻烦。

 

三、字符串初始化

1.初始化char数组

char header[]="Media Player";

字面量“Media Player的长度为12个字符”,表示这个字面量需要13个字节,我们就为数组分配了13个字节。初始化操作会把这些字符复制到数组中,以NUL结尾。

char header[] = "Media Player";
printf("%d\n", sizeof(header));//输出13

也可以使用strcpy函数初始化数组

char header[13];
strcpy(header, "Media Player");


下面的赋值是不合法的,我们不能把字符串字面量的地址赋给数组名字。

char header[13];
header = "Media Player";//表达式必须是可修改的左值


2.初始化char指针

最常用的方法是使用malloc和strcpy函数分配内存并将字面量复制到字符串中:

char *header = (char *)malloc(strlen("Media Player" + 1));
strcpy(header, "Media Player");

在决定malloc函数要用到的字符串长度时,要注意以下事项。

一定要记得算上终结符NUL;

不要用sizeof操作符,而是用strlen函数来确定已有字符串的长度,strlen不会算上‘\0’;

sizeof操作符会返回数组和指针的长度,而不是字符串的长度。

 

我们可以将字符串字面量的地址直接赋值给字符指针,不过这样就不会产生字符串的副本:

char *header="Media Player”;

试图用字符字面量来初始化char指针不会起作用。因为字符字面量是int类型,这其实是尝试吧整数赋给字符指针。这样会造成应用程序在解引指针时终止:

char *p = 'h';//char *与int的间接级别不同,虽然这一行不报错,但是解引时会出错。不合法。
printf("%c\n", *p);//报错

给char*指针赋值,这样都是可以的:

char *s;
s="123";

char *s="123";
s="456";

 

3.从标准输入初始化字符串

#include<stdio.h>
int main()
{
	
	char a[10];
	char *b = (char *)malloc(sizeof(char) * 10);
	printf("Enter a array:\n");
	scanf("%s", a);//输入字符后,会自动加上\0,所以只能输9个字符。
	printf("%s", a);
	printf("Enter b array:\n");
	scanf("%s", b);
	printf("%s\n", b);
	return 0;
}

从标准输入读入字符串时可能犯得错误:

char *command;
printf("Enter a Command:\n");
scanf("%s", command);//没有分配内存


4.字符串位置小结

我们可能将字符串分配在几个地方,下面解释了几种可能的变化,下图说明了这些字符串在内存中的布局

char *globalHeader = "Chapter";
char globalArrayHeader[] = "Chapter";
void displayHeader()
{
	static char * staticHeader = "Chapter";
	char *localHeader = "Chapter";
	static char staticArrayHeader[] = "Chapter";
	char localArrayHeader[] = "Chapter";
	char *heapHeader = (char *)malloc(strlen("Chapter" + 1));
	strcpy(heapHeader, "Chapter");
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值