首先C语言本质上是没有String类型的,都是基于字符数据操作。
一. 数组
1. 本质
数组是同一类型多个元素的集合,在内存中分布在地址连续的单元中。所以可以通过其下标访问不同。
2.字符数组
- 即数组中的元素对应的是字符
- 可以直接定义 char str[10];
- 也可以在定义的时候初始化即 char str[10]={“hussvgcjc”}; 这样程序执行的时候会把husscvgcjc\0依次填入
- 数组名表示数组的第一个元素的地址
- c语言中操作字符串的终极本质是通过它在内存中的存储单位的首地址进行的
- 数组名是常量,指针是变量,即可以出现将数组复制给指针,但是指针不能赋值给数组。对于字符数组来说,即字符数组与字符指针。
char *s;
char a[];
//可以出现
s=a;
// 不存在
// a = s;
- 字符指针可以通过间接操作符 * 取其内容,也可以用数组的下标形式,当然数组也是可以的,因为数组也是地址,也是可以通过间接操作符进行操作的。
二. 指针
1.指针首先是一个变量
它的内存中存放的是一个其他标识位置的地址,由于地址都是整数,在32位系统中,即是4字节。
2. 指针的指向
指的是指针变量所内存中所保存地址的对应的数据的类型。但是无论指针的指向是什么类型,指针都是整型,因为它保存的都是地址。
1. char * 与 char a[]
char * b保存的是一个字符串首地址的指针变量,char a[]是许多连续的存储单元,每个单位里面都是char。都可以使用间接操作符 * 去操作。但是他们的本质属性是不一样的。
2. char ** 与 char *a[]
2.1 char *a[]
- 首先是 [ ] 的优先级高于 * ,即a会先于 [] 结合,即首先它是一个数组,它的存储单元里面存放的是指向char类型的指针变量,即是地址。这样就可以近似理解为字符串数组的样子。即a[1]存放的是字符串“cjc”的地址。数组的内存是连续的,但是存储单元中存储的字符串的地址,并不是连续的。
char *a[] = {"cjc","wxy","taylor"}
2.2 char **a
- char **a 即为二级指针,可以类比二维数组去理解,可能好些。、
char *a[] = {"cjc","wxy","taylor"};
char **b = a;
- 上面这个情况,首先a是一个数组,数组名表示第一个元素的地址,是数组内第一个存储单元的地址而不是第一个存储单元内的地址。但是不可以倒过来赋值,切记,数组a是一个常量。
char **a=“hello cjc”;
- 这样的赋值是错误的,因为 a 是char ** 类型的,但是“hello cjc”是char * 类型的,虽然两个都指的是地址,但是“hello cjc”表示的地址,比如0x1212312,这个地址的内容是“c”是char类型,而a呢,这个保存的内容是(* s)即是char * 是一个指针类型。固然两者的类型是不一样的。
谈这个也是因为,写LeetCode的时候遇到一个char ** 想去了解一下的,要是以后想起来了,有不足的地方还会慢慢更新的。七夕快乐。