以char类型为例:

char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char

char *p = a;    //p类型为 char*, *p类型为char。 也可以写成char *p = &a; 类型char[100]和char (*)[100]可隐式到char*转化,指向第一个元素的地址。不包含隐式转换的写法应该:char *p  = &a[0];   而它们的区别:

数组类型与sizeof与指针的引用

再看

#include <iostream>

void test(char *p) //即使形参为char p[]或char p[100]
{
    //p类型为char *,一指针类型。即使传递的实参类型是char[100],也会退化到char*
    std::cout << sizeof(p) << std::endl; //编译时计算,指针大小为4
    
    p[0] = 'z';
}

int main()
{
    char a[100] = "abcdef";
    test(a);

    std::cout << a << endl;//"zbcdef"  
    return 0;  
}

要想test函数里sizeof正确输出大小,test函数的形参可以改为char (*p)[100]或 char (&p)[100] ,指定大小为100是必要的,因为char[100]不能转为char (&)[],char (*)[100]也不能转为char (*)[] 。那么定义a时改为char a[] = "abcdef";可不可以呢~~~不行,a的数组大小编译时计算,它的实际类型为char[7]而不是char[]

#include <iostream>

void test(char (*p)[100])
{
    std::cout << sizeof(*p) << std::endl; //形参已经显示指定大小了,可以肯定输出100了。

    (*p)[0] = 'z';
}

int main()
{
    char a[100] = "abcdef";
    test(&a);

    std::cout << a << std::endl;//"zbcdef"
    return 0;  
}
使用char (*p)[100]

相关文章:

  • 2021-10-12
  • 2022-12-23
  • 2021-07-16
  • 2022-12-23
  • 2022-01-19
  • 2021-08-08
  • 2022-12-23
  • 2021-06-04
猜你喜欢
  • 2021-09-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-30
  • 2021-12-23
  • 2022-12-23
相关资源
相似解决方案