平时都用的是char数组,基本忘记了char*数组和char**数组该怎么用了
char s1[10];
s1[0]s1[1]等都是char
s1是char*,等同于&s1[0]
char*s2[10];
s2[0]s2[1]等都是char*
*s2[0]*s2[1]等都是char,是s2[0] s2[1]指向的字符串的第一个字符
s2是char**,等同于&s2[0]
char**s3[10];
s3[0]s3[1]等都是char**
*s3[0]*s3[1]等都是char*,是s3[0],s3[1]这些char**指针指向的那个char*指针
**s3[0]**s3[1]等都是char,是*s3[0] *s3[1]这些char*指针指向的字符串的第一个字符
s3是char***,等同于&s3[0]
char s1[3];
内存中的数据如下图
明确这一点:指针的值就是它所指向的那个地址,对指针做*运算,就是把指针所指向的那个地址的值取出来
s1[0] s1[1] s1[2]存放的是字符
s1这个char*指针的值是0x0012ff60,说明s1这个char*指针指向的地址是0x0012ff60,这个地址处存放着s1[0]这个字符。
s2[0]是一个char*指针,指向字符串”1234”
*s2[0]是第一个字符‘1’
s2这个char**指针的值是0x0012ff4c,说明s2这个char**指针指向的地址是0x0012ff4c,这个地址处存放着一个char*指针,也就是s2[0]。
s2[0]这个char*指针的值是0x0012ff60,和s1这个char*指针的值相同,说明s2[0]这个char*指针指向的地址也是0x0012ff60,这个地址存放着s1[0]这个字符。
s3[0]=&s2[0];
char s1[4]="123";
上面这段代码的输出如下图
(1245012转成16进制就是12ff54)
可以看到,cout<<s2输出的是s2这个char*指针指向的地址处存放的数据,是一个字符串。
cout<<s3
cout<<*s3 输出的是s3这个char**指针指向的那个char*指针所指向的地址处存放的数据,是一个字符串。
可以总结,打印输出一个指针,输出的是指针所指向的地址处所存储的数据
变量其实就是一个地址。普通变量比如inti,i这个变量名就等同于内存中为这个变量分配的地址中存放的数据,这里是一个4字节的整数。和汇编中的直接寻址是不是很像?
指针变量比如char*s,s这个变量名还是等同于内存中为这个变量分配的地址中存放的数据,不过这里的数据不是普通的整数或浮点数数据,而是一个4字节的地址。*s就是这个4字节的地址处存放的数据。是不是和汇编中的间接寻址很像?&s就是内存中为这个变量分配的地址。考虑到我们输出s的时候,输出的都是s这个地址处存放的数据,如果想知道s这个4字节地址本身的值,可以inti=(int)s。