指针的概念:创建一个指针类型的数据,在64位系统中,一个指针类型的数据用8个字节表示。指针类型的数据存储某个数据的地址。编译器,可以根据指针地址处理该地址的数据。
指针
关于指针,一个比较常用的地方就是字符串的处理。字符串的存储示意图如下所示。字符串变量s其实是记录了字符串首字母的地址,指针p也是记录了字符串首字母的地址。
输出字符串时,printf(),读入的地址认为是字符串的首地址,遇到“\0”,认为时字符串的结束。程序执行代码如下图所示。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *p;
char *s = "abcdefgh";
p = s;
printf("s:%s\n", s+1);
printf("len_of_point:%ld", sizeof(p));
}
输出结果:
s:bcdefgh
len_of_point:8
二重指针
指针指向指针,但是二重指针并没有规定所指向内容的长度,所以需要用动态分配内存的方式为其分配空间。二重指针(**p)的示意图如下所示。
p指向指针数组首地址,*p指向字符串地址,**p指向字符串首元素。
关于二重指针的代码如下所示:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char **p;
char s1[10] = {'1' , '2', '3', '4', '5'};
char * s2;
p = malloc(2);
s2 = "abcdefgh";
*p = s1;
p[1] = s2;
p[0][1] = '9';
printf("s:%s\n", p[0] + 1);
printf("len_of_point:%ld", sizeof(p));
free(p);
}
函数输出如下:
s:9345
len_of_point:8
总结:
二重指针需要动态分配内存空间。