美文网首页C Primer Plus(6th)
字符串的数组与指针表示区别

字符串的数组与指针表示区别

作者: akuan | 来源:发表于2020-11-15 14:43 被阅读0次

首先要知道的一点就是C数组的底层实现是指针。
◆对于单条字符串:

char ar1[] = "Something is pointing at me.";
char *pt1 = "Something is pointing at me.";

通过常量指针、指针常量、指向常量的指针常量,我们知道所有的数组都是“常量指针”,而"Something is pointing at me."是字符串字面量,所以ar1能改变指向但不能通过ar1修改字符串的值。而pt1是指针,它指向字符串的首地址。pt1既能改变指向又能通过它修改字符串的值。

两种表示字符串的变量的区别
◆对于多条字符串:
char fruit1[3][7] = {"Apple", "Pear", "Orange"};
char *fruit2[3] = {"Apple", "Pear", "Orange"};

fruit2中的指针指向初始化时所用的字符串字面量的位置,这些字符串字面量被储存在静态内存中。而fruit1中的数组则储存着字符串字面量的副本,所以每个字符串都被储存了两次。此外,为字符串数组分配内存的使用率较低。fruit1中的每个元素的大小必须相同,而且必须是能储存最长字符串的大小。
我们可以把fruit1想象成矩形二维数组,每行的长度都是最大字符串的长度,此为7字节,它的元素是连续储存在内存中的。符号“*”优先级很低,低于“[]”,所以一维数组fruit2[3]的每个元素都是指针(对于字面量就是匿名的指向字符串字面量首元素的指针)。可以把fruit2想象成不规则的数组,每行的长度不同。实际上,fruit2数组的指针元素所指向的字符串不必储存在连续的内存中。
fruit1fruit2表示同一个二维数组,它们的区别:一个是直接存储的字符串字面量,一个是存储的指针。所以,它们占用的内存大小是不一样的。

强调两种数组的不同
访问它们的方式:
两种表示方式访问同一元素
fruit1是‘常量指针’:指向不能变,可通过指针修改数据。
fruit2也是‘常量指针’:指向不能变,但对于指针fruit2[N]而言,它是一个常量指针,没有限制。要如同fruit1一样的性质,通常加const声明,像这样const *fruit2[3],这样fruit2[N]就是一个‘常量指针了’,这样防止了fruit2[N]被赋值其他地址(试想如果真被赋予值了,它的二维数据性质就变了。

相关文章

  • 11.1 字符串和指针

    关于指针输出字符串 将字符串看作指针 使用指针表示法创建字符串 数组和指针的区别、数组名heart 是常量,指针名...

  • 字符串的数组与指针表示区别

    首先要知道的一点就是C数组的底层实现是指针。◆对于单条字符串: 通过常量指针、指针常量、指向常量的指针常量[htt...

  • C 指针区分

    看下如下各种的区别: 数组指针例子: 指针数组: 查找字符串的例子: 数组名字相当于指针: 函数指针: 回调小例子:

  • C语言18 指针与字符串

    C语言18 指针与字符串 字符串的几种表示方式有什么区别? 常用的字符串函数 指针函数 本质就是函数,只不过函数的...

  • 【C语言笔记】<十六>指针和字符串

    通过数组保存字符串和通过指针保存字符串的区别 注意点

  • 指针与数组的区别和联系

    原文地址:指针与数组的区别和联系作者:zhenhuaqin 一.指针与数组的联系: 指针与数组是C语言中很重要的两...

  • 结构体

    字符串数组的方式 字符串指针的形式 区别 字符串数组由于预先已经分配内存红箭 所以可以直接赋值:通过strcop(...

  • C语言指针相关

    一、指针数组 和 数组指针的区别:1:指针数组,还是数组,数组每个元素是指针。2:数组指针,是指针,指向的是数组。...

  • C语言字符串和字符串函数

    字符串的表示方式 把字符串看作指针 字符串数组和指针 看下面例子 可以看到,数值的地址是没有发生变化的,只是内容改...

  • 关于指针与数组表示

    1、一维数组 定义一个指针P 赋值p=&a[0] a+i=&a[i]=p+i *(a+i)=a[i] 仅当p...

网友评论

    本文标题:字符串的数组与指针表示区别

    本文链接:https://www.haomeiwen.com/subject/gejibktx.html