【题记:这个问题一直困扰了我多年,今天终于完全看明白了,于是尝试写一篇博客。 2020/10/18】

C语言中的字符串是字符数组,可以像处理普通数组一样处理字符串。
可以理解为在内存中连续存储的字符。

  1. 从实用主义而言,我们先给出结论。
    我们会用到的一般有两种。
    · 声明一个字符串:char* a = "abcdefg";
    · 声明一组字符串:char* a[] = {"China","French","America","German"};

  2. 原理
    这里只考虑静态数组,在内存中划分了连续的地址空间。字符串以“\0”为结尾符。

  3. 地址/字符串的输出与查看
    假设a是一个指针变量,为了查看这个指针变量的内容,我们可以用%p输出查看。printf("%p",a);
    查看这个字符型指针变量的字符串:printf(%s,a);
    注意指针变量也是存在内存里的,自己也有个地址。用&a表示。

  4. char*
    很多资料中会写成char* a而不是char *a,事实上我本科学C语言的时候一直认为是char (*a),但其实前者可以一起理解:

char*: 用于声明一个只是保存字符串首地址的指针变量

  1. 符号优先度
    a[]的优先度大于*a。

  2. 指针与二级指针
    这里可以回到我们开头所说的两种定义了。
    第一种:
    · 声明一个字符串:char* a = "abcdefg";
    这个理解起来非常容易,定义了一个字符串"abcdefg",在连续的内存空间里存储,并且定义了一个保存这个字符串的首地址的指针变量a,所以a的值为字符’a‘所存的地址。
    如果我们用printf("%s",a),将输出abcdefg。
    · 声明一组字符串:char* a[] = {"China","French","America","German"};
    a[]是一个4长数组,里面存了四个指针变量:a[0],a[1],a[2],a[3]。分别指向字符串China,French,American和German的首地址。
    而a[]的值也就是a也就是这个数组的首地址,也就是a[0]的地址。
    ·二级指针
    二级指针就是指针的指针。在第二种声明中,我们用到的二级指针:
    a[0]是指向字符串China的指针,而a是指向a[0]的指针。
    二级指针的赋值与声明:char **s = a; //定义了一个名为s的二级指针,指向a的地址
    即,*s=a[0],也就是printf("%s",*s)

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include <string>
#include <iostream>
using namespace std;int main(){char* a[] = {"China","French","America","German"};printf("%p\n",a);for (int i = 0; i < 4; i++){printf("a[%d] is %p\n",i, a[i]); //用于查看a[i]的内容(所指的目标的地址值)printf("address a[%d] is %p\n",i, &a[i]); //用于查看a[i]自己的地址//printf("%d\n",sizeof(&a[i])); printf("%d\n",sizeof(a[i])); //用于查看a[i]自己的大小(指针变量的大小 4字节)printf("%s\n",a[i]); //用于打印指针变量的字符串}char **s = a; //定义二级指针sprintf("%p\n",s); //输出s=a[0]的地址printf("%s\n",*s); //输出*s=a[0]所指的字符串cout << a[0][2]; //i cout << (*s)[2]; //isystem("pause");
}

运行结果:

【C】 字符数组:char,char*,char a[], char *a[], char **s 的区别与联系相关推荐

  1. MFC中CString类字符串与长整型、浮点型、字符数组char数据之间的相互转换

    一.长整型数据与CString类字符串相互转换 1.将长整型数据转换为CString字符串类 CString str; long ld; str.Format(_T("%ld"), ...

  2. C语言中字符数组初始化的几种方法

    欢迎关注我的微信公众号:CurryCoder的程序人生 1.C语言中的字符数组初始化 在C语言中,字符串是当做字符数组来处理的:所以字符串有两种声明方式,一种是字符数组,一种是字符指针. 1.1 直接 ...

  3. 【C 语言】字符串操作 ( C 字符串 | 字符数组始化 )

    文章目录 一.C 字符串 二.字符数组始化 一.C 字符串 C 字符串特征 : C 语言中的字符串都是以 '\0'字符 结尾的 字符数组 ; C 字符串本质 : C 中 没有字符串类型 , 都是使用 ...

  4. c语言 字符串数组末尾,C语言中,利用宏定义一个字符串和字符数组定义的字符串其末尾都会自动添加\0字符...

    利用宏定义一个字符串#define MYPHONE "AT+CMGS" 字符数组的方式来定义一个字符串unsigned char SMS[]="HELLO, WELCOM ...

  5. c++ string 拼接_C++日志(二十五)字符数组、字符数组指针和string类

    C++中字符串的表示方式有很多种,根据自己目前掌握的有三种: 字符数组: 字符数组指针: 标准库string类: 上面几种方式各有优点和缺点,按照自己的观点,如果处理的字符串的任务比较简单,则使用前两 ...

  6. Delphi 的字符及字符串[4] - 字符串、字符指针与字符数组

    //字符串 < > 字符数组 vararr: array[0..5] of Char;str: string; begin{可以把字符串常量直接赋给字符数组; 但超界不行}arr := ' ...

  7. C语言中字符数组的初始化与注意事项

    在C语言中字符数组的初始化有三种常见的方法: char a[5] = {'a','b','c','d','e'};char c[] = {'a','b','c','d','e'};char b[] = ...

  8. c语言中字符串数组应用,C语言中字符变量字符串和字符数组应用.doc

    C语言中字符变量字符串和字符数组应用 字符变量(type`char`?字符串(string)和字符数组(type`char`arrary)是C语言中非常重要的结构成分,也是应用编程中常发生混淆?导致错 ...

  9. C++中字符数组和字符串string

    字符数组 C++中字符数组用char str[]能够用来表示一个字符串. (1)   数组的大小和字符串的长度. 数组的大小一定要大于字符串的长度,由于系统会自己主动补上一个'\0'作为字符串的结束标 ...

  10. 字符数组与字符串处理函数

    C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符类型数组中的. 定义.初始化.引用字符数组 1.定义:用字符数组来存放字符数据,在字符数组中的一个元素内存放一个字符.定义方法与定义数值型数 ...

最新文章

  1. Ubuntu MySQL
  2. storyboard和xib的区别
  3. 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程
  4. android 数据存储怎么保存图片_文章要保存为TXT文件,其中的图片要怎么办?Python帮你解决...
  5. html图片自适应浏览器高度,css如何高度自适应浏览器高度?
  6. 智慧交通day01-算法库03:cv.dnn
  7. python队列精灵对战_python队列Queue
  8. Python kafka操作实例
  9. 魅族营销翻车,被骂上热搜,官博致歉并暂停运营两天...
  10. 解决Golang程序运行时占用内存不断增加的问题
  11. debian开机打开浏览器_使自動起動! 我学到了!原来“文件”可以跟“应用程序”一样,都能设置开机自启!!...
  12. Android音频系统扫盲
  13. android js 弹窗,Android原生代码拦截H5 Web页面中JavaScript弹窗/弹框
  14. retrofit + rxjava2报错java.lang.IllegalStateException:Excepted a String but was BEGIN_OBJECT at line..
  15. 性能自动化测试之LoadRunner场景设计
  16. Animated详解
  17. java中特殊符号怎么校验_校验中文、空格和特殊符号的方法
  18. 2020-11-01 Mybatis TypeAlise、resultMap、日志settings
  19. hive的一些常用命令
  20. 数据结构 严薇敏 堆 的实现及其使用方法详解

热门文章

  1. 「九省联考 2018」一双木棋
  2. OOo:重新设计,全面翻新 (转自“袁萌专栏”)
  3. Leetcode--Java--389. 找不同
  4. 好工具,促成好开发 -- YesDev
  5. matlab可以当作eclipse,如何将MATLAB与Eclipse集成
  6. 基于PowerVM VIOS虚拟化技术实战笔记分享
  7. 【Unity项目优化宝典】静态批处理和动态批处理
  8. 北理计算机在线,祝烈煌_北京理工大学计算机学院
  9. layui添加复选框_layui table的复选框 重载后增加回显
  10. 使用VUE对复选框进行选择