字符串、字符数组、sizeof、strlen

(1)字符串

1.1 C语言没有原生字符串类型
(1)很多高级语言像java、C#等就有字符串类型,有个String来表示字符串,用法和int这些很像,可以String s1 = “linux”;来定义字符串类型的变量。
(2)C语言没有String类型,C语言中的字符串是通过字符指针来间接实现的。

1.2 C语言使用指针来管理字符串
(1)C语言中定义字符串方法:char *p = “linux”,其实就是定义了一个字符指针,p占了8个字节,linux占了6个字节,

1.3、C语言中字符串的本质:指针指向头、固定尾部的地址相连的一段内存
(1)字符串就是一串字符。字符反映在现实中就是文字、符号、数字等人用来表达的字符,反映在编程中字符就是字符类型的变量。C语言中使用ASCII编码对字符进行编程,编码后可以用char型变量来表示一个字符。字符串就是多个字符打包在一起共同组成的。
(2)字符串在内存中其实就是多个字节连续分布构成的(类似于数组,字符串和字符数组非常像)
(3)C语言中字符串有3个核心要点:第一是用一个指针指向字符串头;第二是固定尾部(字符串总是以’\0’来结尾);第三是组成字符串的各字符彼此地址相连。
(4)’\0’是一个ASCII字符,其实就是编码为0的那个字符(真正的0,和数字0是不同的,数字0有它自己的ASCII编码)。要注意区分’\0’和’0’和0.(0等于’\0’,'0’等于48)

ASCLL码

C语言中使用ASCII编码对字符进行编程,编码后可以用char型变量来表示一个字符

ASCLL码是由八位二进制构成的,范围是0-255,也就是(0~2^8-1)
0到255的每个ASCLL码表示的字符有不同的含义,0表示’\0’,而48表示‘0’;
在这里插入图片描述

(5)’\0’作为一个特殊的数字被字符串定义为结尾标志。产生的副作用就是:字符串中无法包含’\0’这个字符。(C语言中不可能存在一个包含’\0’字符的字符串)

(2)sizeof和strlen

(1)sizeof是C语言的关键字,也是C语言的一个运算符int、double等原生类型占几个字节和平台有关;二是C语言中除了ADT之外还有UDT,所以用sizeof运算符来让编译器帮忙计算。
(2)strlen是一个C语言库函数,这个库函数的原型是:size_t strlen(const char *s);这个函数接收一个字符串的指针,返回这个字符串的长度(以字节为单位)。注意一点是:strlen返回的字符串长度是不包含字符串结尾的’\0’的。我们为什么需要strlen库函数?因为从字符串的定义
(3)sizeof(数组名)得到的永远是也就是数组的大小,和数组中有无初始化,初始化多、少等是没有关系的;strlen是用来计算字符串的长度的,只能传递合法的字符串进去才有意义,如果随便传递一个字符指针,但是这个字符指针并不是字符串是没有意义的。
(4)数组定义时必须给出大小,要么直接给,要么给初始化式

char a[] = "linux" 
char a[] = {
    
    'l', 'i', 'n', 'u', 'x', '\0'}


字符串char *p = "linux";定义了一个字符指针p,p占4字
节,分配在栈上;同时还定义了一个字符串"linux",分配在代
码段;然后把代码段中的字符串(一共占6字节)的首地址(也
就是'l'的地址)赋值给p。

int mystrlen(const char *p)
{
    
    
	int cnt = 0;
	while (*p != '\0') //*的优先级比++的高
	{
    
    
		cnt++;
		p++;
	}
	return cnt;
}

char b[5];


int main(void)
{
    
    
	// 字符串存在栈上
	char a[7];	
	char *p = a;
	
	// 字符串存在数据段
	char *p = b;
	
	// 字符串存在堆空间
	char *p = (char *)malloc(5);
	
/*	
	char *p = "linuxddd";
	printf("sizeof(p) = %d.\n", sizeof(p));		// 8
	printf("strlen(p) = %d.\n", strlen(p));		// 8
*/	
	
/*
	char a[7] = "windows";			// a[0] = 'w', a[1] = 'i', ````a[6] = 's'
	printf("sizeof(a) = %d.\n", sizeof(a));		// 7
	printf("strlen(a) = %d.\n", strlen(a));		// >=7
*/
	
/*
	char a[] = "windows";			// a[0] = 'w', a[1] = 'i', ````a[6] = 's', a[7] = '\0'
	printf("sizeof(a) = %d.\n", sizeof(a));		// 8
	printf("strlen(a) = %d.\n", strlen(a));		// 7
*/	
/*	
	char a[5] = "windows";
	printf("sizeof(a) = %d.\n", sizeof(a));		// 5
	printf("strlen(a) = %d.\n", strlen(a));		// 5
*/
	
/*
	char a[5] = "lin";
	printf("sizeof(a) = %d.\n", sizeof(a));		// 5
	printf("strlen(a) = %d.\n", strlen(a));		// 3
*/
/*
	char a[5] = {2, 3};
	printf("sizeof(a) = %d.\n", sizeof(a));		// 5
	printf("strlen(a) = %d.\n", strlen(a));		// 2
*/	
/*
	char a[5] = {0};
	printf("sizeof(a) = %d.\n", sizeof(a));		// 5
	printf("strlen(a) = %d.\n", strlen(a));		// 0
*/
/*	
	char a[5];
	printf("sizeof(a) = %d.\n", sizeof(a));		// 5
	printf("strlen(a) = %d.\n", strlen(a));		// 5
*/	
	
/*
	char *p = "linux";
	//int len = strlen(p);// 5
	int len = mystrlen(p);
	printf("len = %d.\n", len);
*/	

猜你喜欢

转载自blog.csdn.net/shun1296/article/details/114946148