二维字符数组与char** 关系

数组和指针联系很紧密,数组名的含义至少有两种含义:

      1. 对应数据中的第一个元素的地址,

      2. sizeof为数组大小,而不是指针大小

注:《c专家编程》中有详细介绍

       指针使用经验总结.pdf 中也有相关内容

编程中,需要向某个函数传递一个字符串数组。测试代码如下:

#include <stdio.h>  
#define M 2  
#define N 100  
 
void test(const char** pstr)  
{  
    int i = 0;  
    for(i = 0; i < 2; i++)  
    {  
        printf("array[%d]= %s/n",  i,*(pstr+i));  
    }  
    return;  
}  
 
int main()  
{  
    char char_array[M][N] = {"a.txt", "b.txt"};  
      
    test((const char**) char_array);  
 
    return 0;  

#include <stdio.h>
#define M 2
#define N 100

void test(const char** pstr)
{
 int i = 0;
 for(i = 0; i < 2; i++)
 {
  printf("array[%d]= %s/n",  i,*(pstr+i));
 }
 return;
}

int main()
{
 char char_array[M][N] = {"a.txt", "b.txt"};
 
 test((const char**) char_array);

 return 0;
}

期望能输出数组中的两个字符串。

很不幸实际编译运行时,出现段错误。:( 仔细查看后,发现有如下几个需要注意的问题:

1. 传递给test的紧紧是二维字符数组的首地址

2. test 参数中pstr的类型是char**, *(pstr+i)的类型是 char*

3. char**的内存结构可以看成有多个连续的char*类型的元素构成,而二维字符数组是由M*N个字符组成。

                                                        内存示意图

      可以发现,当用char**传递二维字符串数组的首地址时。相同的地址空间,但由于元素类型不一样,取出的值也不一样。

使用*pstr时,实际上取出的是前4个字符组成的int值,不是期望中的char_array[0]的起始地址。所以出现段错误也就很好理解了。

      如果想通过char**传递,那么将字符串定义为

char* str_array[M];  
     

      str_array对应的就是一个char*类型组成的数组。这样就不会有问题了。

查看《c专家编程》,发现c语言的“多维数组”,其实就是数组的数组,可以看成是一种向量(即某种对象的一维数组,它的元素可以是另一个数组)。

C指针经验总结中对数组名问题有过一段总结:

    声明了一个数组 TYPE array[n], 则数组名称array就有了两重含义:

    1. 它代表整个数组,它的类型是TYPE[n], 大小是 n*(sizeof(TYPE));

    2. 它是一个常量指针,该指针的类型是TYPE* ,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组

         第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的,该指针的值是不能修改的,即类似

         array++的表达式是错误的。

    在不同的表达式中,数组名array可以扮演不同的角色。

    1. sizeof(array)     array代表数组本身

    2. sizeof(*array)   算出的数组单元的大小

    3. sizeof(array+n) 算出的是指针类型的大小,32位机器中为4

 

 

 

原文:http://blog.csdn.net/fantasy666666/archive/2009/08/07/4422110.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值