首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于数组长度的疑义

2013-11-09 
关于数组长度的疑问#include iostreamusing namespace stdint fun(char (*p)[]){cout(*p)[1]endlr

关于数组长度的疑问


#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)数组长度基础之上, 我该怎么正确调用这个函数呢. 
[解决办法]
int main()
{   
char * arr[3] = {"hello","word","wan"}; 
fun((char (*)[])arr);
    return 0;
}
[解决办法]
char (*p)[]数组指针是指向数组首元素的地址的指针,其本质为指针;
指针数组是数组元素为指针的数组(例如 char *arr[3]定义了arr[0],arr[1],arr[2]三个指针),其本质为数组。
数组指针的使用在某些情况下与指针数组很相似,要注意区别。
楼主这种情况不能这样传参吧。fun((char (*)[])arr);我试了下强制转换能传,但是传过去的指针的值是一个不可预料的地址。达不到程序的要求。
[解决办法]
类型不一样  fun里面的参数为指向一维数组的指针(数组指针)  而
    char *arr[3] = {"hello","word","wan"};中的arr是一个指针数组

[解决办法]
lz没搞清数组指针和指针数组的区别
char (*p)[3]是数组指针,是一个指向char[3]的指针,char *arr[3]是指针数组,数组里面有3个char*
[解决办法]
这个函数没法调用,因为char (*p)[]是0长度数组的指针,不能确定数组大小。
如果这个函数编译可以通过,那就强制转换吧。
不过不能保证结果是对的。
即使,行得通,你也没有办法直接,用这个指针输出数据。



引用:

#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占用空间。

热点排行