C语言 字符串和指针

用指针实现的字符串:

#include <stdio.h>

int main(void){
	char *p = "vv";
	printf("p = \"%s\"\n", p);
	p = "cat";
	printf("p = \"%s\"\n", p);
	
	return 0;
}

运行结果:
在这里插入图片描述

char *p = "vv";
printf("p = \"%s\"\n", p);

用指针实现的数组 p:
p 是指向char型变量的指针变量,它的初始值为字符串字面量 “vv”。对字符串字面量进行判定,可以得到指向该字符串字面量第一个字符的指针。所以 p 被初始化为指向保存在内存中的字符串字面量“vv”的第一个字符串’v’的指针。

使用指针实现字符串的错误声明:

char * p = {'v', 'v', 'c', 'a', 't', '\0'};

数组用的{}形式的初始值,不可用于单一的变量。

在内存空间中,指针 p 和 字符串字面量 “vv” 双方都占据了内存空间。

#include <stdio.h>

int main(void){
	
	char *p = "vv";
	
	printf("p = \"%s\"\n", p);
	printf("sizeof(p) = %u \n", sizeof(p));
	printf("sizeof(\"vv\") = %u \n", sizeof("vv"));
	
	return 0;
}

运行结果:
在这里插入图片描述
指针 p 占用的空间为 sizeof§,即 sizeof (char*)字节,其长度因编译器而异。
所以,用指针实现的字符串比用数组实现的字符串需要更多的内存空间。


char *p = "vv";
printf("p = \"%s\"\n", p);
p = "cat";
printf("p = \"%s\"\n", p);

用数组实现的字符串和用指针实现的字符串的不同的地方是:
可以为指向字符串字面量(中的字符)的指针赋上指向别的字符串字面量(中的字符)的指针。赋值后,指针指向新的字符串字面量(中的字符)。

注意:
p的中的字符串发生变化,并不是完全复制了字符串,在内存中指针的指向发生了变化,指针不再指向“vv”,“vv”不能被访问,在内存中变成了无法被清楚的垃圾。因为字符串字面量具有静态存储器,在不需要的情况下,不会自动被从内存空间清除。


#include <stdio.h>

int main(void){
	char str[] = "2020";
	printf("str = \"%s\"\n", str);
	
	str = "07/08";    // 此赋值方式 在字符串数组中不可以使用,编译错误
	printf("str = \"%s\"\n", str);
	
	return 0; 
}

字符串数组直接赋予数组变量,以下3种是错误的赋值方式:
char str[6];

  1. str = {‘V’, ‘V’, ‘c’, ‘a’, ‘t’, ‘\0’};
  2. str = “VVcat”;
  3. str = {“VVcat”};

#include <stdio.h>
#define LEN 6 

int main(void){
	int i ;
	char a[][LEN] = {"2020", "7", "vvcat"};
	char *p[] = {"2020", "7", "vvcat"};
	
	for(i = 0; i < 3; i++){
		printf("a[%d] = \"%s\", sizeof(a[%d]) = %u \n", i, a[i], i, sizeof(a[i]));
	}
	
	
	
	puts("---------------------------");
	
	for(i = 0; i < 3; i++){
		printf("p[%d] = \"%s\" sizeof(p[%d]) = %u \n", i ,p[i], i, sizeof(p[i]));
	}
		
	puts("---------------------------");
	printf("sizeof(p) = %u \n", sizeof(p));
	printf("sizeof(\"2020\") = %u \n", sizeof("2020"));
	printf("sizeof(\"7\") = %u \n", sizeof("7"));
	printf("sizeof(\"vvcat\") = %u \n", sizeof("vvcat"));
	
	return 0;
}

运行结果:

在这里插入图片描述

可以看出二维数组和指针数组虽然都能实现对多个字符串的储存,但是其本质是完全不一样的,一个是定义时就已经分配了储存字符串的空间,而另一个只是定义了指向字符串的指针,本身并不具有储存字符串的空间,需要现给其一个指向,才能将字符串储存到相应的位置,指针也要占用一定的内存空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值