字符串,字符指针,字符串指针,字符数组

2 篇文章 0 订阅

对于指针可能是大多数程序员最痛苦的事,尤其是指针和字符串和数组三者放在一起的时候,经历了几次错误后,我打算总结一下这几者的区别.

字符串:"asdasfsff",c语言中后面有'\0'.
字符数组:A[7] = |'a'|'b'|'c'|'d'|'e'|'f'|'\0'|,每一个元素是一个字符
字符指针:char *p; p指向单个字符
字符串指针:char *p; 首先声明他是指针,p指向一个字符串或者字符数组

现在说明了几者是什么,现在说说之间的联系与区别

1.字符串可直接赋值给字符数组

A[7] = “sdffas”;
这种情况数组后面会自动加’\0’.并且数组的首地址就是字符串的首地址,也是字符串首元素的地址,因此字符串指针可以直接指向数组首地址p = A;
在这里,数组是变量,存储在栈区,可以更改,字符串是数组的值

A[2] = 'a';是符合语法的.
*(p+2) = 'c'后者p[2] = 'c'是相同的意思.

2.字符串可直接赋值给字符串指针

char p = “asdasdsd”;
注意这里的赋值是指地址赋值,并且这里的字符串是常量,其后没有'\0'.这种情况
访问字符串是可以的如:printf("%s %c",p,p+2);这样会分别输出整个字符串和第三个字符(从0开始),但是如:
(p+2) = ‘c’;会报段错误,这是因为指针p只是一个指针变量,可以更改指向,但是不能更改之中的内容,因为其所指的字符串是常量,存储在全局区

3.同理当指针指向数组的首地址时,可以更改指向,也可以更改其中的内容,因为数组是变量

eg:

char A[] = "asdasdasd";//定义数组
char *p = A;//指针指向数组,指针是变量,他的内容是数组的地址,因此可以改变
printf("%c",p+3);//访问数组的内容
*(p+3) = 'd';//通过指针改变数组终的内容,因为指针所指向的内容是变量,存储在栈区,可以更改

4.字符指针与字符串指针的区别

没区别,叫法不一样而已,因为在c/c++中任何的数据类型都有规定的大小来存储内容,其地址也是有固定的大小,不同的系统位数大小不一样.没定义 一种类型,系统就会为其开辟一定的大小的空间,因此在赋值和参数传值是必须确保参数的 类型统一.
举个例子:

int num;//声明了一个变量,但是没有分配内存
num = 3;//为变量num分配了内存大小为4个字节(32位系统),且将其内容设置为3
int *p;//声明了一个int 类型的指针,没有分配大小
p = num;//p 的内容是变量num的地址,p的大小为4个字节(这个我在32和64位机子上测试都是4个字节,但是按理来说指针类型的变量大小也跟系统位数有关)
int *q = 3;//定义指针并且赋值,此时系统开辟了地址给q,内容是3
int *z = num;//定义指针并且指向num;z的内容是num的值,z的地址在系统栈区,

所以字符指针就指向一个字符就行,而字符串指针实则只是指向了字符串后者字符数组的首地址,即第一个字符,因此地址匹配.只不过是字符串后置字符数组的元素之间地址连续,所以可以通过一个指向字符的指针访问整个字符串.
这里再次强调一下,在c/c++中,赋值,函数传参,不管是什么类型,必须要匹配,指针只能赋值给指针(地址赋值给地址),int赋值给int.....,这就是c/c++为什么快的原因之一.

还有一点就是什么可以访问,什么不可以访问,什么可以更改,什么不可以更该.

记住这么一点,程序访问都是访问内存,内存主要分为两部分,一个是系统区域,也就是从0开始的一小部分,此部分不能访问,剩下的都是用户可访问的部分.如果您在程序中发现段错误,数组越界等等问题,就是访问到了系统区.
还有就是常量不可更改,变量可以更改,这不是废话吗?但你为什么还要用指针该常量呢?哈哈..这里解释一下变量,函数等在内存中的存储形式,这样会理解更深.

用户区的内存部分分为栈区,堆区,全局区,代码区等.

一般用户定义的变量,函数运行的局部变量,形参和函数返回值都会放在栈区,这样就可以实现更改,这也就是为什么函数内部的变量在函数执行完之后会被释放的原因.
而定义的常量,静态变量和全局变量的存储区域是全局区(静态区),一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放
代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。
堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏

  • 16
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

siyan985

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

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

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

打赏作者

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

抵扣说明:

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

余额充值