引數為*&與*的區別以及二維陣列傳遞時列數不對等的區別

龍騰萬里發表於2020-11-28

一、引數*&與*的區別

開闢空間時的區別:
(1)引數為*&address

typedef struct Anode{
	int weight;
	struct Anode *next;
}ANode;
void createAddress(Anode *&address){
	address = (Anode *)malloc(sizeof(ANode));
} 
int main(){
	Anode *address;
	createAddress(address);
	return 0;
}

此時不會報錯

(2)引數為*address

typedef struct Anode{
	int weight;
	struct Anode *next;
}ANode;
void createAddress(Anode *address){
	address = (Anode *)malloc(sizeof(ANode));
} 
int main(){
	Anode *address;
	createAddress(address);
	return 0;
}

此時報錯:指標address沒有初始化。

總結

由於*&address取了address的地址,因此在void函式裡開闢空間,相當於為主函式裡的address開闢了空間,在void函式回收時不會被銷燬;相反,*address因為沒有取到address,因此在void函式回收時會被銷燬,因此報錯。

二、二維陣列傳遞時列數不對等的區別

(1)傳遞二維陣列的列數和引數中二維陣列的列數相等時

#include <stdio.h>

void printA(int A[][3]){
	int i, j;
printf("----------\n");
	for(i = 0 ; i < 6 ; i++){
		for(j =  0; j < 3 ; j++){
			printf("%d ", A[i][j]);
		}
		printf("\n");
	}
}

int main(){
	int num[6][3];
	int i, j;
	for(i = 0 ; i < 6 ; i++){
		for(j =  0; j < 3 ; j++){
			scanf("%d", &num[i][j]);
		}
	}
	printA(num);
	return 0;
}

在這裡插入圖片描述
此時的值與輸入的值一一對應。

(2)傳遞二維陣列的列數和引數中二維陣列的列數不相等時

#include <stdio.h>

void printA(int A[][4]){
	int i, j;
printf("----------\n");
	for(i = 0 ; i < 6 ; i++){
		for(j =  0; j < 3 ; j++){
			printf("%d ", A[i][j]);
		}
		printf("\n");
	}
}

int main(){
	int num[6][3];
	int i, j;
	for(i = 0 ; i < 6 ; i++){
		for(j =  0; j < 3 ; j++){
			scanf("%d", &num[i][j]);
		}
	}
	printA(num);
	return 0;
}

此時有些軟體會報錯,有些軟體會警告(可以執行,但是相應的值不對等,這裡具體體現為A與num對應的值不相等)

總結

此時由於二維陣列A的列數為4,二維陣列num的列數為3,列數不相等,有的軟體會提示兩者不相容,而有的軟體會警告:[Warning] passing argument 2 of ’ printA ’ from incompatible pointer type [enabled by default],可以執行,但是二維陣列num與A的值不會一一對應。
小提示:Courier New字型是word裡面最接近寫程式碼的字型,裡面的符號容易區分中英文。

相關文章