c++ 数组用指针方式传递给函数以后如何获得数组的长度

c++ 数组用指针方式传递给函数以后如何获得数组的长度,第1张

数组作为一个参数传出去,那么他就会“退化”成一个指针类型,进而失去“数组的属性”。(这里的数组不是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判断指针长度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9688048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存