user-0 提问: 关于数组长度的疑问

回复:
user: user-1
content: 上面有一点搞错了  char *arr[3] ={arr[0],arr[1],arr[2]}; //3.4）让指针数组的元素,                                               //指向二维数组的一维数组元素的首地址. 改为  char *arr[3] ={a[0],a[1],a[2]}; //3.4）让指针数组的元素,                                               //指向二维数组的一维数组元素的首地址.

user: user-1
content: 这个函数没法调用，因为char (*p)[]是0长度数组的指针，不能确定数组大小。 如果这个函数编译可以通过，那就强制转换吧。 不过不能保证结果是对的。 即使，行得通，你也没有办法直接，用这个指针输出数据。    引用 楼主 aore2010 的回复: #include <iostream>  using namespace std;  int fun(char (*p)[]) { 	cout<<(*p)[1]<<endl; 	return 0; }  int main() { 	char *arr[3] = {"hello","word","wan"}; 	fun(arr);    //这里调用方式不对 在不改变int fun(char (*p)[]) 中的参数的基础之上,怎么才能调用成功呢 	return 0; }    就是说一直保持 char (*p)[] 在不指定(*p)数组长度基础之上, 我该怎么正确调用这个函数呢.  这个程序编译通过，也不能保证调用结果是对的 因为 char *arr[3] = {"hello","word","wan"}; 是指针数组，不是数组指针，也不是二维数组。 即便编译成功，所以参数传递的结果也是错误的。 如果改成 char arr[3][10]= {"hello","word","wan"}; 也许行。  这样是可以的 1）二维数组，作为一维数组的指针传递，必须是定长的一维数组指针。  #include <iostream>  using namespace std;  int fun(char (*p)[10]) { 	cout<<p[1]<<","<<p[2]<<","<<p[3]<<endl; 	return 0; }  int main() { 	char arr[3][10] = {"hello","word","wan"}; 	fun(arr);    	return 0; }  2）指针数组，作为指针数组传递，或者作为二级指针传递。 int fun(char *p[]);和int fun(char **p) 是同一函数形式的不同写法。作用一样。  作为函数参数的数组，可以看作指针，最后那个维度的大小不起作用。 可以把数组名的最后的中括号去掉，改为在数组名前面加个星号（*）。 C++引用例外。     #include <iostream> using namespace std; //int fun(char **p) 和int fun(char *p[]) 都可以。 int fun(char *p[]) //参数改成char *p[3]，char *p[4]和不写长度作用一致。所以一般不写。 { 	cout<<p[0]<<","<<p[1]<<","<<p[2]<<endl; 	return 0; }  int main() { 	char *arr[3] = {"hello","word","wan"}; 	fun(arr);    	return 0; }    3）指针数组和数组指针，以及二维数组同时使用。   #include <iostream> using namespace std;  //3.1）指针数组参数，就是二级指针参数。 //int fun(char **p) 和int fun(char *p[]) 都可以。 int fun(char *p[]) //参数改成char *p[3]，char *p[4]和不写长度作用一致。所以一般不写。 { 	cout<<p[0]<<","<<p[1]<<","<<p[2]<<endl; 	return 0; } //3.2 数组指针,必须是定长的数组的指针。 int fun_arr_ptr(char (*p)[10]) { 	cout<<p[1]<<","<<p[2]<<","<<p[3]<<endl; 	return 0; } int main() { 	char a[3][10] = {"hello","word","wan"};//3.3）二维数组         char *arr[3] ={arr[0],arr[1],arr[2]}; //3.4）让指针数组的元素,                                               //指向二维数组的一维数组元素的首地址.         char *ptr_arr[]={"hello","word","wan"};//3.5）指针数组，大概只有字符指针数组可以这么做。          	fun(arr);  //3.6）指针数组         fun(ptr_arr);  //3.7）指针数组         fun_arr_ptr(a);//3.8）数组指针    	return 0; }   3.5） 大致相当于3.3），3.4） 的联合写法。不过不论数组和字符串，都不必是确定长度的， 编译系统，可以自动检测出，数组的元素个数，和字符串的长度。 其实 char *ptr_arr[]={"hello","word","wan"};//3.5）指针数组，大概只有字符指针数组可以这么做。 相当于  char *ptr0="hello",*ptr1="word",*ptr2 ="wan";  char *ptr_arr[]=｛ptr0,ptr1,ptr2｝; 由于ptr0，ptr1,*ptr2，是不需要在程序里出现的，所以并不占用空间。 只有常量"hello"等和指针数组ptr_arr占用空间。

user: user-2
content: 数组名本身就是一个指针

user: user-3
content: 类型不一样  fun里面的参数为指向一维数组的指针（数组指针）  而     char *arr[3] = {"hello","word","wan"};中的arr是一个指针数组

user: user-4
content: char (*p)[]数组指针是指向数组首元素的地址的指针，其本质为指针； 指针数组是数组元素为指针的数组(例如 char *arr[3]定义了arr[0],arr[1],arr[2]三个指针)，其本质为数组。 数组指针的使用在某些情况下与指针数组很相似，要注意区别。 楼主这种情况不能这样传参吧。fun((char (*)[])arr);我试了下强制转换能传，但是传过去的指针的值是一个不可预料的地址。达不到程序的要求。

user: user-4
content: int main() {    char * arr[3] = {"hello","word","wan"};  fun((char (*)[])arr);     return 0; }

user: user-5
content: //是不是写错了？ 看看这个  int fun(char *p[]) {     cout<< p[1]<<endl;     return 0; }

user: user-6
content: 程序员自己维护数组长度就那么难吗？

user: user-7
content: 引用 7 楼 buyong 的回复:char *arr[3] = {"hello","word","wan"}; 这能编译？  这样可以的。。   但是不懂楼主为什么去把指针数组转换为数组指针。。。这两个混合用。。。有点。

user: user-8
content: char *arr[3] = {"hello","word","wan"}; 这能编译？

user: user-9
content: int fun(char *p[]) { 	cout<<p[1]<<p[0]<<p[2]<<endl; 	return 0; } 函数写成这样形式，可以呀。

user: user-1
content: 似乎应该编译错误，才对！！！！

user: user-1
content: 你要传递长度为0的数组指针，很难保证结果是对的。

user: user-10
content: 就是一个数组指针和指针数组的关系，需要了解这两个名字定义的不同。char *arr[3] = {"hello","word","wan"}; 这个是指针数组， 形参是数组指针。

user: user-11
content: lz没搞清数组指针和指针数组的区别 char (*p)[3]是数组指针，是一个指向char[3]的指针，char *arr[3]是指针数组，数组里面有3个char*

user: user-12
content: 引用 7 楼 buyong 的回复:char *arr[3] = {"hello","word","wan"}; 这能编译？难道你也弄混淆了？

user: user-0
content: 感谢大家关注, 我一般是定义大小的, 只是今天有人问我 我竟然不知道这样该怎么调用 丢人了, 所以请教大家这个函数该怎么调用

user: user-1
content: 引用 6 楼 shangyu0801 的回复:int fun(char *p[]) { 	cout<<p[1]<<p[0]<<p[2]<<endl; 	return 0; } 函数写成这样形式，可以呀。 ++ 这种就可以。  而下面这种 int fun(char (*p)[]) { 	cout<<p[1]<<p[0]<<p[2]<<endl; 	return 0; } 只怕不可以。

user: user-1
content: 引用 7 楼 buyong 的回复:char *arr[3] = {"hello","word","wan"}; 这能编译？ 这个真行！