二重指针为什么需要动态分配空间

指针的概念:创建一个指针类型的数据,在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

总结:

二重指针需要动态分配内存空间。

猜你喜欢

转载自blog.csdn.net/makesifriend/article/details/80663906
今日推荐