string指针指向字符串数组做形参,作为形参,为什么输出还是没有比较过字符串大小?

C++字符串数组如何作为函数参数_百度知道
C++字符串数组如何作为函数参数
void TEST(string *y,string *x);int main(){string y[]={&y1&,&yb&};string x[]={&x1&,&x2&,&x3&,&x4&};TEST(y,x);cout&&sizeof(y)&&
//在主函数中y的长度的确是2*8=16cout&&sizeof(x)&&
// 输出x的长度是4*8=32return 0;}void TEST(string *y,string *x){cout&&sizeof(y)&&
//调用出现问题,此处输出了y的长度为8cout&&sizeof(x)&&
//此处输出了x的长度为8}为什么会出现这个问题?是调用出错还是函数参数部分写错?应该如何改正?
提问者采纳
&sizeof(string),由于它们都是和系统相关的(我的操作系统是32位的),所以在不同的系统下取值可能不同,这务必引起注意,尽量不要在这方面给自己程序的移植造成麻烦。一般情况下,在32位系统中,sizeof(string)为16字节。sizeof都和内存中的存储方式有关。你这里没有理清楚数组函数的传参的实质,你这里定义字串数组string[]x, string []y; &在main函数中,x,y都是数组, sizeof(x)的值为数组的长度*sizeof(string)。值得注意的是x也代表数组x中元素的首地址。这里不要把sizeof(x)的值理解为4(即指针的长度),但是在函数中的数组会定义为指针。如你的函数:void TEST(string *y,string *x){&cout&&&test_y-& &&&sizeof(y)&&&&&//这时候值为4(你的为8),因为在传参时传递的是首元素的地址,函数在内存空间定义一个指针类型y,指向数组y,这时候在内存中y实际为指针类型&cout&&&test_x-& &&&sizeof(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&}
我大致看懂了,我现在把这个数组传进函数里的时候,好像只读了第一个字符串,如果我希望把这个字符串数组完整地传进函数里面用的话该怎么办?
void TEST(string *y,string *x){ cout&&&test_y-& &&&sizeof(y)&&
//调用出现问题,此处输出了y的长度为8 cout&&&test_x-& &&&sizeof(x)&&
//此处输出了x的长度为8 for(int i = 0; i & 4; i++)
cout&&x[i]&&&
&; cout&&}
提问者评价
其他类似问题
为啥要用C语言的数组呢? 你的这个问题是由于将数组传递给函数时数组的长度信息丢失导致。C++有自己的“ 数组”
: std::array
std::vector
std::dynarray用这些更好,而且都是标准库,C++编译器可能优化这些“数组”的性能。
来自团队:
为您推荐:
其他2条回答
这个是c++的语言特性的问题。将数组作为函数参数,数组会退化成指针。也就是在函数TEST中,y和x不再是数组,仅仅是指针。指针的长度都一样。所以将数组作为参数传入时,一般会将数组长度作为另一个参数,不然函数无法判断数组长度。
当数组名做形参在函数体内时,数组名失去了其常量特性,沦落为与指针相同四字节待遇的平民。简单的讲,就是如果你想把数组传给一个函数,那么必须将这个数组的长度也传给这个函数。因为数组名当形参时,他就会退化成一个4字节的指针,同时这个数组的长度你也没法知道了
您可能关注的推广回答者:
字符串数组的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁您还未登陆,请登录后操作!
c语言指针数组和字符串数组的区别,高手请进
,只是对数组的定义不同,第一个定义的是指针数组,是对的;第二个定义的是字符串数组,却是错的。指针数组的v[i]和字符串数组的v[i]不都是表示指向一个字符串的一级指针吗?二者有什么不同?为什么第二个是错的?
程序一:
#include &stdio.h&
main()
{char *line[]={&C++&,&Fortran&,&Basic&,&Pascal&,&Foxbase&};
shellsort(line,n);
writeline(line,n);
}
shellsort(v,n)
char *v[];
for(i=0;i&n-2;i++)
{for(j=n-1;j&i;j--)
if(strcmp(v[j-1],v[j])&0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
writeline(linp,n)
char *linp[];
for(i=0;i&n;i++)
printf(&%s\n&,linp[i]);
}
程序二:
#include &stdio.h&
main()
{char line[][10]={&C++&,&Fortran&,&Basic&,&Pascal&,&Foxbase&};
shellsort(line,n);
writeline(line,n);
}
shellsort(v,n)
char v[][10];
for(i=0;i&n-2;i++)
{for(j=n-1;j&i;j--)
if(strcmp(v[j-1],v[j])&0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
writeline(linp,n)
char linp[][10];
for(i=0;i&n;i++)
printf(&%s\n&,linp[i]);
}
方法一用来交换字符串的原理是改变指针数组成员指向的地址,这没有问题。
但是如果把line声明成2维数组,数组的地址值是不能随意修改的,所以,你无法强制把line[0]指定到其他地方。
可把方法二的字符串交换处理作如下改动:
char t[10];
for(i=0;i&n-2;i++)
for(j=n-1;j&i;j--)
if(strcmp(v[j-1],v[j])&0)
/*t=v[j];v[j]=v[j-1];v[j-1]=t;*/
strcpy(t, v[j]);
strcpy(v[j], v[j-1]);
strcpy(v[j-1], t);
中:
t=v[j];v[j]=v[j-1];v[j-1]=t;
这里的v是二维数组line的形参,line是数组,而不是程序一中的那个指针数组
line[1]是不可以看成一个指针,它的地址是固定不变的
所以你上面的赋值是完全错误的!!!
终极帅哥sl
不会别乱讲!!!
我觉得你错了,其实改不改是一样的
不相信你自己试一试
您的举报已经提交成功,我们将尽快处理,谢谢!
大家还关注
<a href="/b/.html" target="_blank" title="分解因式 加强版 分解因式 加强版
Description
一个自然数N的正因子个数记为F(N),例如18的所有正因子为1、2、3、6、9、18,所以F(18)=6。现在给出K,求所有满足F(N)=K的N中最小的数.
第一行n,表示有n个数据,1<=n<=10
接下来n行,每行一个数k,1<=k分解因式 加强版 分解因式 加强版页面导航:
→ 正文内容 c语言 字符数组 字符串
c语言字符数组与字符串的使用详解
本篇文章是对c语言中字符数组与字符串的使用进行了详细的分析介绍,需要的朋友参考下
1、字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' )。
2、字符数组与字符串在c语言中,将字符串作为字符数组来处理。(c++中不是)在实际应用中人们关心的是有效字符串的长度而不是字符数组的长度,例如,定义一个字符数组长度为100,而实际有效字符只有40个,为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符'\0'代表。如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个。也就是说,在遇到第一个字符'\0'时,表示字符串结束,由它前面的字符组成字符串。系统对字符串常量也自动加一个'\0'作为结束符。例如"C Program”共有9个字符,但在内存中占10个字节,最后一个字节'\0'是系统自动加上的。(通过sizeof()函数可验证)有了结束标志'\0'后,字符数组的长度就显得不那么重要了,在程序中往往依靠检测'\0'的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。(在实际字符串定义中,常常并不指定数组长度,如char str[ ])说明:'\n'代表ASCII码为0的字符,从ASCII码表中可以查到ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。对C语言处理字符串的方法由以上的了解后,再对字符数组初始化的方法补充一种方法――即可以用字符串常量来初始化字符数组:char str[ ]={"I am happy"};&&&&&& 可以省略花括号,如下所示char str[ ]="I am happy";注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的&&&&&&&&&&&& char str[ ];&&&&&&&&&&& str="I am happy";不是用单个字符作为初值,而是用一个字符串(注意:字符串的两端是用双引号“”而不是单引号‘'括起来的)作为初值。显然,这种方法更直观方便。(注意:数组str的长度不是10,而是11,这点请务必记住,因为字符串常量"I am happy"的最后由系统自动加上一个'\0') 因此,上面的初始化与下面的初始化等价char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};而不与下面的等价char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};前者的长度是11,后者的长度是10.说明:字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0',向下面这样写是完全合法的。char str[5]={'C','h','i','n','a'};++++++++可见,用两种不同方法初始化字符数组后得到的数组长度是不同的。
#include &stdio.h&void main(void){char c1[]={'I',' ','a','m',' ','h','a','p','p','y'};char c2[]="I am happy";int i1=sizeof(c1);int i2=sizeof(c2);printf("%d\n",i1);printf("%d\n",i2);}结果:10&& 11
3、字符串的表示形式在C语言中,可以用两种方法表示和存放字符串:(1)用字符数组存放一个字符串&&&&&&&&&&char str[ ]="I love China";(2)用字符指针指向一个字符串&&&&&&&&&&char* str="I love China";对于第二种表示方法,有人认为str是一个字符串变量,以为定义时把字符串常量"I love China"直接赋给该字符串变量,这是不对的。C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给str。两种表示方式的字符串输出都用printf("%s\n",str);%s表示输出一个字符串,给出字符指针变量名str(对于第一种表示方法,字符数组名即是字符数组的首地址,与第二种中的指针意义是一致的),则系统先输出它所指向的一个字符数据,然后自动使str自动加1,使之指向下一个字符...,如此,直到遇到字符串结束标识符 " \0 "。4、对使用字符指针变量和字符数组两种方法表示字符串的讨论虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈。4.1、字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中(是字符串首地址)4.2、赋值方式:&&&& 对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值&&&& char str[14];&&&& str="I love China";&&&& (但在字符数组初始化时可以,即char str[14]="I love China";)&&&& 而对字符指针变量,采用下面方法赋值:&&&& char*&&&& a="I love China";&&&& 或者是 char* a="I love China";&&&&&& 都可以4.3、对字符指针变量赋初值(初始化):&&&&&&&& char* a="I love China";&&&&& 等价于:&&&&&&&&&& char*&&&&&&&&&& a="I love China";而对于字符数组的初始化&&&&&&&&& char str[14]="I love China";不能等价于:&&&&&&&& char str[14];&&&&&&&& str="I love China"; (这种不是初始化,而是赋值,而对数组这样赋值是不对的)4.4、如果定义了一个字符数组,那么它有确定的内存地址;而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。
5、字符串处理函数 5.1char *strcat(char *str1,const char *2 );char *strcat(char *strDestination,const char *strSource );功能:函数将字符串str2 连接到str1的末端,并返回指针str1注:连接前两个字符串的后面都有一个' \0 ',连接时将字符串1后面的 ' \0 ‘去掉,只在新串最后保留一个 ' \0 ‘5.2char *strcpy(char *str1,const char *2 );char *strcpy(char *strDestination,const char *strSource );功能:复制字符串strSource中的字符到字符串strDestination,包括空值结束符。返回值为指针strDestination。注:1、“字符数组1”必须写成数组名形式,“字符串2"可以是字符数组名,也可以是一个字符串常量2、复制时连同字符串后面的 ' \0 ' 一起复制到数组1中3、不能用赋值语句直接将一个字符串常量或者字符数组直接赋给一个字符数组(同普通变量数组是一样的),而只能用strcpy函数处理。4、可以用strcpy函数将字符串2中的前若干个字符复制到字符数组1中去。
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910}

我要回帖

更多关于 二维数组 形参 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信