指针数组 和数组指针,该如何解决
指针数组 和数组指针
有个数组:
char* s[2][3]={ {"123"},{"456"}, {"789"} };
s 这个数组的类型是:char* [3], char* [3] 是一个指针数组, char* s[2][3] 自然也是一个指针数组了,
编译错误,什么原因???
第二个问题:
数组指针有什么用啊, 谁能举个例子啊,
------解决方案--------------------
------解决方案--------------------
char* s[2][3]={ {"123"},{"456"}, {"789"} };
{{},{},{}} <- 用这种形式初始化第一维必须有三个以上的元素,因为最外层大括号里面有三个元素(里面有三个大括号)
数组和指针可以看成类型的修饰:
(注意这里不是C/C++里的写法)char *[4]*[3]** 这个叫char的指针的四个元素的数组的指针的三个元素的指针的指针。这种类型的数据,首先是个指针,指向的还是个指针,然后指向的是一个三个元素的数组,数组里的元素又是指针,指向的都是四个元素的数组,然后这些数组的元素又都是指向char类型数据的指针。
C/C++里不能像上面那样写,因为C/C++里希望能用一个char定义出带不同修饰的变量比如:
char a[3], *b;
这样能同时定义出数组和指针变量。所以指针和数组变成了变量名的修饰。另外又因为习惯,数组尺寸定义必须放在变量名后面而不是前面。最后问题复杂化了——
char **(*(*a)[4])[3]; <- 表达的意义上面写的char *[4]*[3]**一样,但是C/C++里就这么乱。
这里的括号的作用可以看成把右半边右边的数组尺寸定义挪到括号左半边的左边:
char (*a)[4]; -> char [4]* a;
这样就能把C/C++的指针/数组混合类型写法,转变成一开始说的比较好认的写法。
至于为什么会有这么复杂的关系,因为需要。并且其实原理也没什么复杂的。
另外数组可以不太严格的看成事先申请好空间的没办法移动的指针
数组参与运算的时候,绝大多数情况下是直接转化为第一个元素的只读指针处理的(一般的例外只有取地址和取长度)。
指针就是一个地址,而指针的基础类型决定者当你使用*重定向的时候得到一个什么类型的变量:
char *p;的话 *p得到的就是char类型变量。char **p;的话*p得到的就是char *类型的变量。char (*p)[4];的话,*p得到的就是char [4]。
或者当你对指针+n的时候实际加的是多少:
char *p;如果p指向的地址是100,p + 1就是101,long *p;的话p + 1就是104,char (*p)[20];的话 p + 1就是120。
------解决方案--------------------
每个大括号{"123"}表示一维,楼主定义的多了。
------解决方案--------------------
------解决方案--------------------
噢。。,那你的那个句子char(* p)[4]=s; 应该是用char *(*p)[4]=s;吧。。
有个数组:
char* s[2][3]={ {"123"},{"456"}, {"789"} };
s 这个数组的类型是:char* [3], char* [3] 是一个指针数组, char* s[2][3] 自然也是一个指针数组了,
编译错误,什么原因???
第二个问题:
数组指针有什么用啊, 谁能举个例子啊,
------解决方案--------------------
------解决方案--------------------
char* s[2][3]={ {"123"},{"456"}, {"789"} };
{{},{},{}} <- 用这种形式初始化第一维必须有三个以上的元素,因为最外层大括号里面有三个元素(里面有三个大括号)
数组和指针可以看成类型的修饰:
(注意这里不是C/C++里的写法)char *[4]*[3]** 这个叫char的指针的四个元素的数组的指针的三个元素的指针的指针。这种类型的数据,首先是个指针,指向的还是个指针,然后指向的是一个三个元素的数组,数组里的元素又是指针,指向的都是四个元素的数组,然后这些数组的元素又都是指向char类型数据的指针。
C/C++里不能像上面那样写,因为C/C++里希望能用一个char定义出带不同修饰的变量比如:
char a[3], *b;
这样能同时定义出数组和指针变量。所以指针和数组变成了变量名的修饰。另外又因为习惯,数组尺寸定义必须放在变量名后面而不是前面。最后问题复杂化了——
char **(*(*a)[4])[3]; <- 表达的意义上面写的char *[4]*[3]**一样,但是C/C++里就这么乱。
这里的括号的作用可以看成把右半边右边的数组尺寸定义挪到括号左半边的左边:
char (*a)[4]; -> char [4]* a;
这样就能把C/C++的指针/数组混合类型写法,转变成一开始说的比较好认的写法。
至于为什么会有这么复杂的关系,因为需要。并且其实原理也没什么复杂的。
另外数组可以不太严格的看成事先申请好空间的没办法移动的指针
数组参与运算的时候,绝大多数情况下是直接转化为第一个元素的只读指针处理的(一般的例外只有取地址和取长度)。
指针就是一个地址,而指针的基础类型决定者当你使用*重定向的时候得到一个什么类型的变量:
char *p;的话 *p得到的就是char类型变量。char **p;的话*p得到的就是char *类型的变量。char (*p)[4];的话,*p得到的就是char [4]。
或者当你对指针+n的时候实际加的是多少:
char *p;如果p指向的地址是100,p + 1就是101,long *p;的话p + 1就是104,char (*p)[20];的话 p + 1就是120。
------解决方案--------------------
每个大括号{"123"}表示一维,楼主定义的多了。
------解决方案--------------------
------解决方案--------------------
噢。。,那你的那个句子char(* p)[4]=s; 应该是用char *(*p)[4]=s;吧。。