C中字符指针数组的用法(也即字符串数组),配合malloc,char **p;char *p[n];char (*p)[n];三个的区别

当我们需要输入多个字符串时我们就可以借助指针数组或字符串数组来表示。
话不多说直接上程序:

 char *point[3]={"0","0","0"};/*定义了一个字符指针数组,在这里只是给数组开辟了空间,
 也给数组的首地址开辟了一个空间来存放数组的首地址
 而这些空间都是用来存放指针的*/
    //printf("%p\n%p\n%p\n",point[0],point[1],point[2]);
   //printf("%p\n%p\n%p\n",&point[0],&point[1],&point[2]);
    for (int i = 0; i < 3; i++)
    {

	char buffer[20];
    point[i]=(char*)malloc(sizeof (strlen(buffer)+1));/*这边因为要指向字符串,
    所以需要给字符串开辟空间,将开辟的空间的首地址放在上面开辟的数组里*/
    //printf("%p\n",point[i]);
   // printf("%p\n",&point[i]);
    printf("请输入一个字符串:");
    scanf("%s",buffer);
    //gets(buffer);
    strcpy(point[i], buffer);

    }
    for (int i = 0; i < 3; i++)
    {
       printf("%s\n", point[i]);
    }

在来看一个用多重指针来存放字符串的程序:

 	char **point;//={"0","0","0"}; 
 	/* char **point;与上面的不同这里就是定义了一个指向指针的指针
 也就是一个地址,也就是开辟了一个空间来存放地址,所以下面需要对 一维和二维
 再进行开辟空间*/
    //printf("%p\n%p\n%p\n",point[0],point[1],point[2]);
   //printf("%p\n%p\n%p\n",&point[0],&point[1],&point[2]);
    char buffer[20];
    point =(char**)malloc(sizeof (char*)*3);


    for (int i = 0; i < 3; i++)
    {
	 *(point+i)=(char*)malloc(sizeof (strlen(buffer)+1));
    //printf("%p\n",point[i]);
   // printf("%p\n",&point[i]);
    printf("请输入一个字符串:");
    scanf("%s",buffer);
    //gets(buffer);
    strcpy(*(point+i), buffer);
    printf("%s\n", point[i]);
    }
    for (int i = 0; i < 3; i++)
    {
       printf("%s\n", point[i]);
    }

从上面可以看出,其实这两种方法都是可以的;

我们可以思考下面这三种形式有什么区别:

char **p;/*指向字符型指针的指针(在内存中开辟了一个指向字符型指针的指针所需大小的空间:
sizeof(char**))*/
char *p[n];/*  字符型指针数组(在内存中开辟了n块连续的sizeof(char*)大小的空间存放
指针以及开辟了一个sizeof(char**)大小的指针P)    */
char (*p)[n];/*  字符型数组(在内存中开辟了n块连续的字符型大小空间,以及开辟了一个
sizeof(char*)大小的指针为*P指向的,同时还开辟了一个sizeo(char**)大小的空间存放指针p )*/

上面三种形式从上到下开辟的空间依次是增加的;
第二个与第三个主要的不同(从结构上来说:参考前的一篇文章,)

https://blog.csdn.net/weixin_42224577/article/details/108149402

第二个在结构上看只定义了一维,二维的大小都是不确定的;
举个例子就是盖了一栋n层楼房,但是每层的房间有多少是不知道的;
第三个就是确定了二维的大小,并且默认一维就只有一个;
相当于盖了一栋一层n个房间的楼房,但是呢这一维的层数是可以改变的,可以随时往上增加,也就是随时可以往上在往上盖房子;

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值