翁恺老师C语言学习笔记(十)指针_指针与数组

传入函数的数组成了什么?

· 当我们向一段函数传入数组变量,参数接收到的是值,如果我们传入指针时,参数接收到的是也是值(一个地址);
· 如果传入函数的是一个普通变量,它接收到的是一个值
· 如果传入函数的是一个指针,它接收到的也是一个值(地址)
· 如果传入的是一个数组,它接收到的是什么?

我们来看个例子

#include <stdio.h> 

void minmax(int a[], int len, int *min, int *max); 

int main(void)
{
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};
	int min,max; 
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d\n",min,max);
	
	return 0;
}
void minmax(int a[], int len, int *min, int *max)
{
	int i;
	*min = *max =a[0]; 
	for (i=1;i<len;i++){ 
		if(a[i]<*min){ 
			*min =a[i]; 
		}
		if(a[i]>*max){
			*max =a[i]; 
		}
	}
}

分别在main函数和minmax函数里打印出sizeof(a)的大小

#include <stdio.h> 
/*
取出一组数组里的最小的和最大的值 
*/ 
void minmax(int a[], int len, int *min, int *max); 

int main(void)
{
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};
	int min,max;
	/*[Error] cannot convert 'const char*' to 'int*' for argument '1' to 'void minmax(int*, int, int*, int*)'*/ 
	minmax("main sizeof(a)=%lu\n",sizeof(a)); // main调用之前再看下minmax的大小 
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d\n",min,max);
	
	return 0;
}
void minmax(int a[], int len, int *min, int *max)
{
	int i;
	printf("minmax sizeof(a)=%lu\n",sizeof(a)); //输入minmax的大小 
	*min = *max =a[0]; 
	for (i=1;i<len;i++){ 
		if(a[i]<*min){ 
			*min =a[i]; 
		}
		if(a[i]>*max){
			*max =a[i]; 
		}
	}
}

main函数里,

sizeof(a)=68

minmax函数里,

sizeof(a)=4

注意:我的编译器这里会报错,而老师的只是一个警告([Error] cannot convert 'const char’ to ‘int*’ for argument ‘1’ to ‘void minmax(int*, int, int*, int*)’)*
无法将参数’1’的’const char’转换为’int*‘传入’void minmax(int*, int, int*, int*)’*

看到警告或者报错后,我们再试一段代码

#include <stdio.h> 
/*
取出一组数组里的最小的和最大的值 
*/ 
void minmax(int a[], int len, int *min, int *max); 

int main(void)
{
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};
	int min,max;
 
	printf("main   a=%p\n",a);
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d\n",min,max);
	
	return 0;
}
void minmax(int a[], int len, int *min, int *max)
{
	int i;
	printf("minmax a=%p\n",a); 
	*min = *max =a[0]; 
	for (i=1;i<len;i++){ 
		if(a[i]<*min){ 
			*min =a[i]; 
		}
		if(a[i]>*max){
			*max =a[i]; 
		}
	}
}

运行结果

main a=0062FE44
minmax a=0062FE44

将查看a的大小语句改为查看a的指针地址,两个值获取是一样的
问题来了
从这里可以看出maina[]其实就是minmax里的a[]

在这里我们再将minmax函数里的a[0]=1000来看看结果,再回到main里时,它会发生怎样的改变

#include <stdio.h> 
#include <stdio.h> 
/*
取出一组数组里的最小的和最大的值 
*/ 
void minmax(int a[], int len, int *min, int *max); 

int main(void)
{
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};
	int min,max;

	printf("main   a=%p\n",a);
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("a[0]=%d\n",a[0]); //执行main后我们查看a[0]等于多少 
	printf("min=%d,max=%d\n",min,max);
	
	return 0;
}
void minmax(int a[], int len, int *min, int *max)
{
	int i;
	printf("minmax a=%p\n",a); 
	a[0]=1000;
	*min = *max =a[0]; 
	for (i=1;i<len;i++){ 
		if(a[i]<*min){ 
			*min =a[i]; 
		}
		if(a[i]>*max){
			*max =a[i]; 
		}
	}
}

main a=0062FE44
minmax a=0062FE44
a[0]=1000
min=2,max=1000

从这里可以看出来a[]它就是一个指针
刚才报错 main函数里获取sizeof(a)的个数,原因是因为a[]它是一个指针
现在我们将两个函数的a[]全部改为*a, 看看编译是否会通过

传入函数的数组成了什么?

· 函数参数表中的数组实际上就是指针
· sizeof(a) ==sizeof(int
)
· 但是可以用数组的运算符[]进行运算
*

数组参数

· 以下四种函数原型是等价的:
· int sum(int *ar,int n);
· int sum(int *,int);
· int sum(int ar[], int n);
· int sum(int[], int);

数组变量是特殊的指针

**· 数据变量本身表达地址,所以
· int a[10];int *p =a; //无需用 &取地址
· 但是数组的单元表达的是单个变量,对单个需要用&取地址
· a == &a[0]
· []运算符可以对数组做,也可以对指针做:
· p[0]=*p
· 运算符可以对指针做,也可以对数组做:
·a = 25
· 数组变量是 const的指针,所以不能被赋值,两个数组之前不能互相赋值
· int[a] <==> int * const a=…

#include <stdio.h> 
/*
取出一组数组里的最小的和最大的值 
*/ 
void minmax(int *a, int len, int *min, int *max); 

int main(void)
{
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};
	int min,max;

	printf("main   a=%p\n",a);
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("a[0]=%d\n",a[0]); //执行main后我们查看a[0]等于多少 
	printf("min=%d,max=%d\n",min,max);
	/* 验证p[0]=*p */
	int *p= &min; 
	printf("  *p=%d\n", *p);
	printf("p[0]=%d\n", p[0]);
	/* 验证*a=a[0]*/
	printf("*a=%d\n",*a); 
 
	return 0;
}
void minmax(int *a, int len, int *min, int *max)
{
	int i;
	
	printf("minmax a=%p\n",a); 
	a[0]= 1000;
	*min = *max =a[0]; 
	for (i=1;i<len;i++){ 
		if(a[i]<*min){ 
			*min =a[i]; 
		}
		if(a[i]>*max){
			*max =a[i]; 
		}
	}
}

执行结果

main a=0062FE40
minmax a=0062FE40
a[0]=1
min=1,max=55
*p=1
p[0]=1

猜你喜欢

转载自blog.csdn.net/sevensolo/article/details/94127382
今日推荐