c函数形参

_skytrails 2014-06-19 11:25:39
如下代码:
int func(char arr[10])
{
//add code
}
我想知道函数的形参arr传进来的是一个char指针还是一个指向有10个元素的数组的指针?不知道用代码怎么测试!求解……
...全文
229 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
_skytrails 2014-06-23
  • 打赏
  • 举报
回复
前几天有点事,望结帖了!
長島冰茶 2014-06-21
  • 打赏
  • 举报
回复
C语言中把数组作为参数传递给函数后会退化成指向首元素的指针,因为如果直接将数组传递的话会导致大量的复制开销,这与C语言追求性能的初衷是相悖的。
int func(char arr[10])
等价于
int func(char *arr)
测试的话,你可以在函数内使用 sizeof(arr) 获得该变量的大小,如果是32位系统的话,结果是4。你在函数外对数组 char arr[10] 使用 sizeof ,其结果是10
onedayday-tao 2014-06-21
  • 打赏
  • 举报
回复
是指针,编译器把char *p跟char p [ ]等同,因为这样可以极大的节约开销
几罗星人 2014-06-21
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
思考一下为什么不把整个互联网内容当参数传来传去?
打算传给谁?传给不在整个互联网内的电脑?
Morrisss_ 2014-06-21
  • 打赏
  • 举报
回复
是一个char []类型的变量,在使用的时候,编译器将它等效于数组首元素的地址。
xiaohehe00 2014-06-21
  • 打赏
  • 举报
回复
是char指针,指向数组首地址
b_j_m 2014-06-21
  • 打赏
  • 举报
回复
我说说我的理解:

#include<stdio.h>
#include<stdlib.h>

int func( char arr[10] )
{
    printf("#########################\n");
    printf( " %d  \n", sizeof arr  );
    printf( "%c \n", *( arr + 1 ) );
    printf( "%c \n", *( arr + 2 ) );
    printf( "%c \n", *( arr + 3 ) );
   // printf( "%c \n", **arr );
       printf("#########################\n");
    
    }

int main(){
    
    char a[10] = { 'a', 'b', 'c', 'd', 'e','a', 'b', 'c', 'd', 'e' };
    char (*p)[10];
    p = &a;
    
    printf("%c \n", *( *p + 1 ) );
    printf("%c \n", *( *p + 2 ) );
    printf("%c \n", *( *p + 3 ) );
    printf("%d \n", sizeof p );
    
    func( a );
    
    printf( "%d \n" , sizeof a );
    printf( "%d \n" , sizeof( char ) );
    printf( "%d \n" , sizeof( char* ) );
    printf( "%d \n" , sizeof( int* ) );
    printf( "%d \n" , sizeof( double* ) );
    printf( "%d \n" , sizeof( float* ) );
    printf( "%d \n" , sizeof( long double* ) );
    
    
            
    system("pause");
    return EXIT_SUCCESS;
    }
sizeof 操作符判断它的操作数的类型长度,以字节为单位表示。当sizeof 的操作数是个数组名时,它返回该数组的长度,以字节为单位。 观察以上的代码,func()函数内如果它传入的是一个数组指针,则要两次解引用,但是报错了,所以我将这个过程注释掉了。所以他不是一个指向10个char类型元素数组的指针。那么他是什么呢?我试了一下如果它是指向数组第一个元素的指针,发现它的值的确是数组变量的地址,所以函数里输出了几个数组内的值。 再者我又试验了它是不是一个指针,或则他传入的是一个数组,通过sizof 操作符作用得到的值是4个字节,我觉得是一个指针变量,因为指针类型的变量的值就是指向的变量的地址。我的内存是4g,寻址2的32次幂,所以用四个字节表示。 相互学习,学习和讨论的过程是在发现自己的不足,希望对你有用。
赵4老师 2014-06-20
  • 打赏
  • 举报
回复
思考一下为什么不把整个互联网内容当参数传来传去?
Claude_Ray 2014-06-20
  • 打赏
  • 举报
回复
传进来的是char*(即使实参a是二维数组,且二维数组本质上就是以数组作为数组元素的数组),传进去的a是一维数组的首地址,刚好在博客区看到一段代码,符合你的问题,改了下贴给你,请按照自己的疑问进行适当修改
#include <stdio.h>

#define PRINT_SIZE(e) printf("%s=%u\n",#e,e)

void func1( int a[10])
{
	PRINT_SIZE( sizeof(a) );    //a是int*
	PRINT_SIZE( sizeof(a[0]) ); 
}
void func2( int a[10][10])
{
	PRINT_SIZE( sizeof(a) );    // a是 int (*)[10]
	PRINT_SIZE( sizeof(a[0]) ); // a[0]  是 int[10]类型
	PRINT_SIZE( sizeof(a[0][0]) );  
}
int main()
{
	int a[10] = {0};
	int b[10][10] = {0};

	func1( a );
        func1( b );
	func2( b );
	return 0;

}
hy_rzhuf 2014-06-20
  • 打赏
  • 举报
回复
把互联网看成一台计算机,每个人就是一个小蚂蚁。
brookmill 2014-06-19
  • 打赏
  • 举报
回复
指向有10个元素的数组的指针是这样的:
char (*p)[10];
printf("%p, %p\n", p, p+1);// 这里两个值相差10,上一个打出来的两个值只差1
brookmill 2014-06-19
  • 打赏
  • 举报
回复
是char指针
printf("%p, %p\n", arr, arr+1);

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧