1. 程式人生 > >陣列傳參,指標作為引數

陣列傳參,指標作為引數

目錄

總結:

一、陣列傳參

1.一維陣列作為引數(形參)

一維陣列作為引數(形參)傳參時——>可用一維陣列來接收(實參)

void test(int[10])
{
	;
}
int main()
{
	int arr [10]= {0};
	test(arr);
	return 0;
}int[10])
{
	;
}
int main()
{
	int arr [10]= {0};
	test(arr);
	return 0;
}

一維陣列作為引數(形參)傳參時——>可用一級指標來接收(實參)

void test(int*p)
{
	;
}

int main()
{
	int arr [10]= {0};
	test(arr
); return 0; }
int*p) { ; } int main() { int arr [10]= {0}; test(arr); return 0; }

C 語言中,當一維陣列作為函式引數(形參,實參)的時候,編譯器總是把它解析成一個指向其首元 素首地址的指標。

2.二維陣列

二維陣列作為引數(形參)傳參時——>可用二維陣列接收(實參)

void test(int arr[][10])
{
	;
}

int main()
{
	int arr [10][10]= {0};
	test(arr);
	return 0;
}arr[][10])
{
	;
}

int main()
{
	int arr [10][10]= {0};
	test(arr
); return 0; }

接受時arr[][]第一個[]中可以忽略,但是第二個[]不能省略,因為二維陣列可以不知道有多少行,但是一定得知道一行有多少個元素。

二維陣列作為引數(形參)傳參時——>可用陣列指標接收(實參)

void test(int (*p)[10])
{
	;
}

int main()
{
	int arr [10][10]= {0};
	test(arr);
	return 0;
}int (*p)[10])
{
	;
}

int main()
{
	int arr [10][10]= {0};
	test(arr);
	return 0;
}

因為C 語言中,當一維陣列作為函式引數的時候,編譯器總是把它解析成一個指向其首元 素首地址的指標,

所以arr[10][10]可以寫作 int (*p)[10]

但這裡需要注意的是:C 語言中,當一維陣列作為函式引數(形參,實參)的時候,編譯器總是把它解析 成一個指向其首元素首地址的指標。這條規則並不是遞迴的,也就是說只有一維陣列才是 如此,當陣列超過一維時,將第一維改寫為指向陣列首元素首地址的指標之後,後面的維 再也不可改寫。比如:a[3][4][5]作為引數時可以被改寫為(*p)[4][5]。

二、指標傳參

1.一級指標傳參(形參)

一級指標傳參(形參)——>可以用一級指標接收(實參)

void test(int *p)
{
	;
}

int main()
{
	int *arr;
	test(arr);
	return 0;
}

指標p只是arr指標的臨時拷貝(在棧上建立),所以test函式結束後就銷燬了,如果要利用指標p則test函式必須要由返回值且型別為指標p的型別。然後在test函式最後加上return p;即可在利用函式返回值返回p的地址。

一級指標傳參(形參)——>可以用二陣列接收(實參)

void test(int arr[])
{
	;
}

int main()
{
	int *arr;
	test(arr);
	return 0;
}

同上C 語言中,當一維陣列作為函式引數(形參,實參)的時候,編譯器總是把它解析成一個指向其首元 素首地址的指標。

一級指標傳參(形參)——>可以用二維指標接收(實參)傳的時一級指標的地址

void test(int**p)
{
	*p= 2;
	return p;
}

int main()
{
	int *arr;
	test(&arr);
	return 0;
}

2.二級指標可以傳參,用三級指標接收。(以此類推)但大部分情況下用來做實參接收一維陣列,指標陣列。

三、指標陣列,陣列指標傳參

1.指標陣列傳參

指標陣列傳參(形參)——>可以用指標陣列接收(實參),也可以用二級指標接收

void test(int *arr[])
{
	;
}

int main()
{
	int *arr[] = { 0 };
	test(arr);
	return 0;
}

指標陣列傳參(形參)——>可以用二級指標接收(實參)

void test(int **p)
{
	;
}

int main()
{
	int *arr[] = { 0 };
	test(arr);
	return 0;
}

同樣C 語言中,當一維陣列作為函式引數(形參,實參)的時候,編譯器總是把它解析成一個指向其首元 素首地址的指標。

int*arr[]是指標陣列做引數時編譯器就解析為int*(*)arr。

2.陣列指標傳參

陣列指標可做維二維陣列傳參時的實參。

總結:

C 語言中,當一維陣列作為函式引數(形參,實參)的時候,編譯器總是把它解析 成一個指向其首元素首地址的指標。這條規則並不是遞迴的,也就是說只有一維陣列才是 如此,當陣列超過一維時,將第一維改寫為指向陣列首元素首地址的指標之後,後面的維 再也不可改寫。比如:a[3][4][5]作為引數時可以被改寫為(*p)[4][5]。