1. 程式人生 > >指標 中 陣列指標,指標陣列,陣列傳參,指標傳參

指標 中 陣列指標,指標陣列,陣列傳參,指標傳參

1.指標陣列

指標陣列是一個數組,裡面每個元素是指標。


初始化如下


2.陣列指標

指向陣列的指標

形式如下int (*p)[5]      因為[ ]比*優先順序高,因此表示一個指標必須給*p帶上括號

賦初值如下



3.陣列指標的應用:

#include<stdio.h>
#include<stdlib.h>
void print(int arr[3][4], int x, int y)
{
	int i= 0;
	int j = 0;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
	print(arr, 3, 4);
	system("pause");
	return 0;
}

上面的程式碼,運用陣列指標也可以寫成如下;

#include<stdio.h>
#include<stdlib.h>
void print(int(*p)[4], int x, int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			printf("%d ", *(*(p + i) + j));
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
	print(arr, 3, 4);
	system("pause");
	return 0;
}

接下來我們思考寫一個數組,陣列有5個元素每個元素是一個指標,且指標指向一個有3個整形元素的陣列,也就是指向陣列的指標陣列

   大家應該就寫成   int  ( *)[3]  arr[5],按理說是對的,但是不是如此規定應寫成  int  ( *arr[5])  [3]  

4.一維陣列傳參


以上引數形式都可以,我挑幾個講一下,

1.用陣列接收當然可以,裡面不用指定大小,因為一維陣列傳參時,形參不會真實建立一個數組,如果是變數值傳遞,那麼形參是實參份臨時拷貝,而陣列傳參時,形引數組不會來一次臨時拷貝,傳的是首元素地址,不會建立一個數組因此沒必要指定大小

2.不指定大小都可以,指定了當然可以

3.傳過去地址,用指標接收當然可以

4.傳過去是指標陣列陣列名,用指標陣列結束接收可以

5.傳過去是指標陣列陣列名,代表首元素地址,首元素是個指標向陣列的指標,再取地址,就表示二級指標,因此用二級指標接收是可以的。

5.二維陣列傳參


1,2,顯然可以,注意裡面的3,5不能同時省略,只可以省略第一個引數3

3錯誤

4.傳過去二維陣列陣列名,代表陣列首元素地址,即第一行地址,第一行是個陣列,因此用一個數組指標接收,因此4也可以。

6.一維指標傳參     即當函式引數部分是一級指標時,可以接受什麼引數例如:test(int*p)

(1)可以是一個整形指標

(2)可以是整型變數地址

(3)可以是一維整型陣列陣列名

7.二維指標傳參     即當函式引數部分是二級指標時,可以接受什麼引數例如:test(int**p)

(1)二級指標變數

(2)一級指標變數地址

(3)一維指標陣列的陣列名

型別有很多,這只是一部分。

8.陣列,指標的宣告和定義

(1)宣告和定義針對同一塊空間

(2)陣列定義需要指定有幾個元素,宣告不需要。因為宣告不會建立空間