C语言中数组和字符串的联系

一、C语言中,数组和字符串

  • 1、C语言中,定义一个数组后,数组名保存的是这个数组的首地址。类似一个指向数组第一个元素的指针,但是这个指针不能重新指向。
  • 2、字符串在C语言中是通过字符数组来实现的,也就是说字符串还是保存在数组里面的。
  • 3、字符串实际上是一个字符序列,它以空字符(null character,即\0)作为结束标志。这意味着在C语言中,当你声明一个字符串时,你需要为这个空字符预留一个额外的位置,因为字符串的长度(不包括结尾的空字符)和数组的大小之间有一个单位的差异。
char greeting[6] = "Hello"; // 这是不正确的,因为数组大小不足以存储结束符'\0'  
char greeting[7] = "Hello"; // 正确的,'\0'会被自动添加到数组的末尾
  • 4、因为字符串保存是数组形式,所以字符串的变量名和数组的变量名,都保存的是第一个元素的地址。用指针取出的时候,取出的都是保存在数组的第一个元素的地址
    数组的名的使用不多赘述。参考下面内容。
#include "stdio.h"

int main() {
    char greeting[] = "Hello";
    char *ptr = greeting;
    //greeting是第一个数字H的地址的值,       使用*greeting取出的是第一个元素的值。
    printf("%p\n", greeting); // 输出数组名greeting 地址
    printf("%p\n", ptr); //  输出指针ptr 地址
    //比较特别的是虽然可以直接输出地址,也可以直接输出 字符内容
    printf("%s\n", greeting); // 输出 'Hello'
    printf("%s\n", ptr); // 输出 'Hello'

    //*greeting  按道理就是数组内的值了。但是因为这个地址是第一个元素的地址,这样输出的是第一个元素的值。所以格式化需要用c.
    printf("%c\n", *greeting); //输出第一个数字H的地址的值
    printf("%c\n", *ptr); // 输出第1个数字H的地址的值
    printf("%c\n", *(ptr+1)); // 输出第2个数字H的地址的值
    printf("%c\n", *(ptr+2)); // 输出第3个数字H的地址的值

    return 0;
}
  • 二、数组名相关的打印内容

#include "stdio.h"

int main() {
    char greet[] = "Hello";
    char *ptr = greet;
//    printf("%c\n", *ptr); //
    printf("指针使用s: %s\n", ptr); //  指针指向数组名, 打印这个指针的值,格式化输出的是字符,就打印出这个字符的内容
    printf("指针使用p:  %p\n", ptr); //  指针指向数组名,打印这个指针的内容,格式化输出的是地址,就打印出这个字符的地址
    
    printf("指针加上求地址符的 p:  %p\n", &ptr); //   这个打印出来的是指针的地址。

    printf("数组变量名使用s:  %s\n", greet);
    printf("数组变量名使用p:  %p\n", greet);

    printf("数组变量名加上求地址符的p: %p\n", &greet); 


    return 0;
}

在这里插入图片描述
对比上面的 1, 2 ,3 . 用一个新指针指向数组后, 使用&这个符号求出的值是不同的。

  • 容易混淆的地方:数组名greet的使用

  • 1、如果对这个变量使用求地址符,&greet,这个值和ptr的值一样,并不是ptr地址的地址。greet是第一个元素的地址,&greet是这个数组的地址。

    • 如果用一个指针先指向数组名,再求地址,结果就不一样了,结果就是greet地址的地址
  • 2、数组名保存的地址,是第一个元素的地址,这个也很模糊。我们说的 数组的地址和数组第一个元素的地址,这两个地址打印出来是一样的。那为什么要强调这两个地址的不同呢?
    尽管在物理地址上它们相同,但强调这两个概念的不同有助于我们更好地理解数组和指针的关系,以及它们在内存中的布局。具体来说:

    • 因为指针不仅要确认指向的地址的开头,还要确认这个地址怎么解析。如果是char类型,就按char类型取出,如果是字符串类型,就可以按这个字符串的类型,取出这个存放在数组里的数,第一个元素的地址就说明,这个指针的类型就是第一个元素的类型。所以直接用指针名取值的时候,要注意这个格式化的输出。
    • 理解指针运算:当你对数组名(作为指向第一个元素的指针)进行指针运算时(如arr + 1),你实际上是在访问数组的下一个元素。这种操作是基于“数组第一个元素的地址”来进行的,但理解这一点有助于你更准确地掌握指针和数组的关系。
    • 内存布局:虽然对于一维数组来说,“数组的地址”和“数组第一个元素的地址”在物理上相同,但对于多维数组来说,情况就有所不同了。多维数组的地址(即数组名所代表的地址)实际上是指向数组最外层元素的指针的地址,而这个最外层元素本身可能是一个指向另一个数组的指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值