将数组作为一个参数传出去,那么他就会“退化”成一个指针类型,进而失去“数组的属性”。(这里的数组不是new出来的)
这里的“属性”指的是数组可以使用sizeof(Array)/sizeof(Array[0])的方法获得其长度的方法的属性。
要在一个函数中得到一个数组的长度,你应该这个数组作为一个引用传出去,那样,就能用sizeof(Array)/sizeof(Array[0])的方法获得长度了。
2sizeof *** 作符用于计算指针的长度时,返回值与系统平台有关,它返回的是系统的字长(以字节为单位),即在32位系统上,它的返回值是4,在64位系统上它的返回值是8,如果想让它本身在计算一个指针长度时返回5,必须在一个字长为40位的系统上来做,而现在一般的系统字长都是2的幂,没有这样的40位字长的系统。所以如果想在现在常用的32位系统上得到5,可以在返回值的基础上加1来实现。
p是字符'a',而不是字符串"abcd“,即p的类型是char,而不是char ,所以不能用p做参数调用strlen()函数,因为strlen()函数需要一个字符指针做参数。
”abcd"是有字符串结束标志的,C语言编译器会自动为字符串常量加一个结束标志,即以下的调用是合法的:
strlen("abcd");
它可以正常的返回字符串"abcd"的长度。
关于第一个问题
ss表示的是一个具体的字符了,所以sizeof(ss)是1
ss是你定义的一个数组,sizeof(ss)就是数组的具体的长度11了
如果你在定义char p=ss,那么此时sizeof(p)就是4了,所有指针变量都是4
这里你要弄清楚是数组还是指针,ss是数组,p是指针,虽然有时数组可以当指针用,但是两者还是由区别的,例如你可以p++,但是决不可以ss++,因为编译器会抱错的.
还有看到楼上有char s = "abcd",要注意s此时是一个指针,但它是一个常量,不要试图s指向的内容,例如s='1',这是错误的.虽然编译时不会出错,但会发生运行错误.但你可以重新给指针赋值让指针指向新的位置,如果新指针内容可以修改的话,直接用s进行赋值是允许的
关于第二个问题
你使用的是位段
a占1位,所以取值范围: 0 - 1
b占2位,二进制最大表示为11,是3,取值范围: 0 - 3
c占3位,二进制最大表示为111,是7,取值范围: 0 - 7
d占4位,二进制最大表示为1111,是15 ,取值范围: 0 - 15
length函数里,指针a要向后移,否则就一直死循环了。
另外,要把统计结果n返回出去,main函数里要把这个返回值赋给变量n。
#include <stdioh>int length(char a)
{
int n=0;
while(a!='\0')
{
n++;
a++;
}
return n;
}
void main()
{
char a[100];
int n;
printf("请输入字符串a:");
gets(a);
n = length(a);
printf("字符串长度为:%d", n);
}
唯一的解决办法就是增加一个长度参数
在字符串指针指向的内容是空字符结尾的字符串的时候,可以使用strlen来获取指向字符串的大小
但是实际指向内存块的大小,是无法知道的。
这是因为指针在作为参数传递的时候,只传过来了地址值,而没有传过来任何长度信息
实际上指针的长度信息是编译阶段获取的,而函数参数无法包含这种信息,故而不可能从指针参数获得指向空间的大小,即是貌似可以的方法,得到的长度也是不可靠的
以上就是关于c++ 数组用指针方式传递给函数以后如何获得数组的长度全部的内容,包括:c++ 数组用指针方式传递给函数以后如何获得数组的长度、C语言的指针和strlen,sizeof的问题。、sizeof判断指针长度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)