char的一些用法

由于C语言中指针过于灵活,导致指针能代替数组使用,或者混合使用,这些导致了许多指针和数组的迷惑。因此,需要深入了解指针和数组;由于其他类型的数组比较简单,容易混淆的是字符数组和字符指针

1.基本概念

1.1 数组

数组是多个元素的集合,在内存中分布在地址相连的单元中,所以可以通过其下标访问不同单元的元素。

1.2 指针

指针也是一种变量,但它的内存单元中保存的是一个标识其他位置的地址。由于地址也是整数,在32位平台下,指针默认为32位。

1.3 指针的指向

指针的指向是指地址中所存放的数据类型。

int * p ;//p 变量保存的地址所在内存单元中的数据类型为整型
float *q;// .................................. 浮点型

不论指向的数据类型为那种,指针变量永远为整型,因为它保存的地址。

1.4 字符数组

字符数组表示元素是字符的数组。
例如char str[10]定义了一个有十个元素名为str的数组,元素的类型为字符。C语言中定义一个变量时可以初始化。char str[10] = {“hello world”};当编译器遇到这句时,会把str数组中从第一个元素把hello world\0 逐个填入。
由于
C语言中没有真正的字符串类型
,可以通过字符数组表示字符串,因为它的元素地址是连续的,这就足够了。C语言中规定
数组代表数组所在内存位置的首地址
,也是 str[0]的地址,即str = &str[0];

  • 难点
    printf(“%s”,str); 为什么用首地址就可以输出字符串。因为在C语言中字符串常量的本质表示其实是一个地址
    例如:
    char *s;
    s = “China”
    为什么可以把一个字符串赋给一个指针变量。
    这不是类型不一致吗???这就是上面提到的关键 。C语言中编译器会给字符串常量分配地址,如果 “China”, 存储在内存中的 0x3000 0x3001 0x3002 0x3003 0x3004 0x3005。
    其实真正的意义是 s =“China” = 0x3000;
    我们把China 看作是字符串,但是编译器把它看作是地址 0x3000,即字符串常量的本质代表它的第一个字符的址。s = 0x3000这样写更符合直观的意思。
    那么 %s ,它的原理其实也是通过字符串首地址输出字符串,printf("%s ", s); 传给它的其实是s所保存的字符串的地址。
#include <stdio.h>
int main()
{
   
	char *s;
	s = "hello";
	printf("%p\n",s);
	return 0;
}

在这里插入图片描述
如果把%p换成%s则输出Hello。
可以看到 s = 005FDC80,这也是"China"的首地址。所以,printf(“%s”,0x00422020)也是等效的。

2.char * 与 char a[ ]

char *s;
char a[ ] ;
前面说到 a代表字符串的首地址,而s 这个指针也保存字符串的地址(其实首地址࿰

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

gyqJulius_Caesar

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值