33,311
社区成员
发帖
与我相关
我的任务
分享
int func(char arr[10])
{
//add code
}
我想知道函数的形参arr传进来的是一个char指针还是一个指向有10个元素的数组的指针?不知道用代码怎么测试!求解……int func(char arr[10])
等价于
int func(char *arr)
测试的话,你可以在函数内使用 sizeof(arr) 获得该变量的大小,如果是32位系统的话,结果是4。你在函数外对数组 char arr[10] 使用 sizeof ,其结果是10
#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次幂,所以用四个字节表示。
相互学习,学习和讨论的过程是在发现自己的不足,希望对你有用。#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;
}
char (*p)[10];
printf("%p, %p\n", p, p+1);// 这里两个值相差10,上一个打出来的两个值只差1
printf("%p, %p\n", arr, arr+1);