函数参数中的字符数组作为指针或数组?

时间:2016-08-10 15:39:13

标签: c

#include<stdio.h>

int strlen1(char *s){

    char *p=s;
    printf("%s\n",s);

    printf("size of s=%d\n",sizeof(s));

    while(*p!='\0')

    p++;

    return p-s;

}

int main(){

    int len;
    char c[]="welcome back ";
    len=strlen1(c);
    printf("%d",len);
    return 0;

}

在这段代码中,char数组作为函数strlen()的参数传递,其中s是一个指针(数组c的第一个元素的地址),然后它为什么打印整个数组,它的大小只有8.还指定了char指针p作为s将不会引用它的地址而不是它的值。请清除我的概念和整个代码的基础知识。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

  

将char指针p指定为s将不会引用其地址   它的价值

当您将s指定给p时,您实际上正在分配地址 如果您只想分配值,那么您需要执行以下操作:

char p; //create a char called p
p = *s; //value at p = value at s

但是你不能使用p。

扫描你的while循环中的数组
  

为什么它打印整个数组

%s表示在看到空字符之前继续打印。因为p指向字符串的第一个地址,它会打印整个内容。

  

它的大小只有8

sizeof(s)表示变量s的大小是多少。您将s定义为char指针,因此它返回大小或char指针(8)。你想要的功能是:

strlen(s);  

修改 修复了删除未定义行为的第一个示例。

答案 1 :(得分:0)

%s获取内存地址并打印字符,直到找到空字符。

当你在声明时初始化一个指针,就像在这种情况下&#34; char * p = s;&#34; ,s的地址分配给p而不是值。

  1. char * p;  P = S;

  2. char * p = s;

  3. 两者都是一样的。

答案 2 :(得分:0)

在大多数情况下,类型为“{-1}}的N元素数组”的表达式将被转换(“衰减”)为“指向{{1}的指针”类型的表达式}“,表达式的值将是数组第一个元素的地址。

此规则的例外情况是:

  • 当数组表达式是T或一元T运算符的操作数时;
  • 当数组表达式是用于初始化声明中的另一个数组的字符串文字时(因此,用于初始化sizeof的{​​{1}}字符串文字是而不是转换为指针表达式;而是将字符串文字的内容复制到&)。

致电时

"welcome back "
表达式 c从“{14}元素的c数组”转换为“指向len=strlen1(c); 的指针”,这个指针表达式是什么实际上传递给c

在函数参数声明的上下文中,charchar被视为与strlen1相同; T a[N]被声明为指向T a[]的指针,而不是T *a的数组。这是有道理的,因为函数不能接收数组表达式作为参数;在传递给函数之前它将被转换为指针。

  

那么为什么它打印整个数组

这就是a转换说明符的工作原理;它告诉T开始打印从T指定的地址开始的字符序列,直到它看到一个0值字节。

  

它的大小只有8

表达式的类型 %sprintf,因此s等同于s(即指针的大小)到char *),所以你显示的是存储指针值所需的字节数,而不是sizeof s指向的字符串的大小。

这是关于我的平台上的事情如何发挥的记忆图,这可能有助于理解其中的一些概念:

sizeof (char *)

这是char条目的状态。

字符串文字s从地址 Item Address 00 01 02 03 ---- ------- -- -- -- -- "welcome back " 0x400c89 77 65 6c 63 welc 0x400c8d 6f 6d 65 20 ome. 0x400c91 62 61 63 6b back 0x400c95 20 00 25 64 ..%d c 0x7fffa9c401a0 77 65 6c 63 welc 0x7fffa9c401a4 6f 6d 65 20 ome. 0x7fffa9c401a8 62 61 63 6b back 0x7fffa9c401ac 20 00 00 00 .... len 0x7fffa9c401bc 00 00 00 00 .... s 0x7fffa9c400e8 a0 01 c4 a9 .... 0x7fffa9c400ec ff 7f 00 00 .... p 0x7fffa9c40128 a0 01 c4 a9 .... 0x7fffa9c4012c ff 7f 00 00 .... 开始存储。字符数组strlen1从地址"welcome back "开始存储。指针对象0x400c89从地址c开始存储,并包含数组对象0x7fffa9c401a0地址(x86是little-endian,因此它从最少读取-signficant字节到最高有效字节)。 对象 s只有8个字节宽,这就是为0x7fffa9c400e8输出c的原因。

您不应使用s格式说明符来打印8类型的值(sizeof(s)返回的值)。如果您使用的是C99或更高版本,请使用%d;如果您使用的是C89,请使用size_t并将值转换为sizeof

%zu