二维字符数组与char** 关系
2010-12-23 16:22
274 查看
数组和指针联系很紧密,数组名的含义至少有两种含义:
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]
= {"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]
= {"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
, 则数组名称array就有了两重含义:
1. 它代表整个数组,它的类型是TYPE
, 大小是 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
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]
= {"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]
= {"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
, 则数组名称array就有了两重含义:
1. 它代表整个数组,它的类型是TYPE
, 大小是 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
相关文章推荐
- 二维字符数组与char** 关系
- 二维字符数组与char** 关系
- 二维字符数组与char** 关系
- 二维字符数组与char** 关系
- 访问 二维动态字符串数组 char** 数组的字符元素
- char * 与 char [] 区别,char *[] 与 char[][]区别。字符串指针的数组与二维char数组区别。字符串常量赋予指针与字符数组区别。"字符串"等价于其首元素"字"的地址
- 【转】字符、字符数组、char、string的区别分析
- C#实现char字符数组与字符串相互转换的方法
- tchar char 字符 和 字符数组 字符串操作
- 关于LinuxC/C++中字符指针char * str 与字符数组 char str []的一点小区别
- 使用qsort对二维字符数组排序疑难问题调试及解决过程
- 二维字符数组与字符串数组的使用
- c++中字符数组与字符串的关系
- 字符和字符串的关系:字符串可以看成是只读字符数组
- 传递 二维 字符数组
- 为二维字符数组赋值
- LPCTSTR char 类型, wchar_t 类型,字符数组区别
- String字符串与字符(char类型)数组互相转换
- 关于二维(字符)数组的输入问题
- 字符、字符数组、char、string的区别分析