翁愷老師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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章