指標(pointer)是程式語言中的乙個物件,利用位址,它的值直接指向(points to)存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此將位址形象化的稱為「指標 」。意思是通過它能找到以它為位址的記憶體單元。
32位平台是4個位元組;64位平台是8個位元組。
char *pc = null;`在這裡插入**片`
int *pi = null;
short *ps = null;
long *pl = null;
float *pf = null;
double *pd = null;
指標的型別決定指標向前或者向後一步的距離。
指標運算
//char* + 1 跳過乙個位元組
//short* + 1 跳過兩個位元組
//int* + 1 4個位元組
//double* + 2 16個位元組
指標減指標 = 指標與指標之間元素的個數。
arr + 1 ==> 位址 由第0個元素 跳到第1個元素
&arr + 1 ==>直接跳過整個陣列
我們可以直接通過指標訪問陣列
int main()
; int *p = arr; //指標存放陣列首元素的位址
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i整型陣列 arr1 = ;
字元陣列 arr2 = ;
指標陣列 arr3 = ;
int* arr3[5];//是什麼?
arr3 是乙個陣列,有5個元素,每個元素是 int* (整形指標)
未完待續…
陣列指標:是能夠指向陣列的指標。
int *p1[10] ; 指標陣列
int (*p2)[10]; 陣列指標
p2 是乙個指標變數,指向乙個含有10個整形元素的陣列。
注意: [ ]的優先順序高於 * 號,所以要加上()。
#includeint main()
; int(*p)[10] = &arr;//將陣列arr的位址賦值給陣列指標變數p
int i = 0;
for (i = 0; i < 10; i++)
return 0;
}
但是一般不這麼寫!!!!
陣列指標一般應用在二維陣列上。
#includevoid print1(int arr[3][5], int x, int y)//列印陣列每個元素,常規寫法
printf("\n"); }}
void print2(int (*p)[5], int x, int y)//呼叫陣列指標
printf("\n"); }}
int main()
, , };
print1 (arr,3,5);
print2 (arr,3,5);
return 0;
}
此時的 p 依舊是陣列首元素的位址,但在二維陣列中是第一行元素的位址。*(p+i)就是遍歷所有的行數。( *(p+i))[ j ]就是遍歷每行中每一列的元素。
int arr[5];
int *parr1[10];
int (*parr2)[10];//陣列指標
int (*parr3[10])[5];//
parr3 是乙個陣列,裡面的10個元素都是指標,每個指標指向一
個5個元素的整形陣列。
parr2 = &parr1? //不可行!資料型別必須對應。如果寫成 int*((*parr2)[10]) = &parr1;則可行
一維陣列傳參
#include void test(int arr)//ok? 對
{}void test(int arr[10])//ok? 對 陣列本身可作為引數
{}void test(int *arr)//ok? 對 陣列名代表首元素的位址,型別為(int*)
{}void test2(int *arr[20])//ok? 對
{}void test2(int **arr)//ok? 對
{}int main()
; int *arr2[20] = ;
test(arr);
test2(arr2);
}
陣列傳參,引數可以是陣列(容易)也可以是指標(需要分析)。
二維陣列傳參
#include void test(int arr[3][5])//ok?對
{}void test(int arr)//ok?錯
{}void test(int arr[5])//ok?對
{}//總結:二維陣列傳參,函式形參的設計只能省略第乙個的數字。
//因為對乙個二維陣列,可以不知道有多少行,但是必須知道一行多少元素。
//這樣才方便運算。
void test(int *arr)//ok?錯!二維陣列中陣列名代表第一行元素(一維陣列)的位址。
{}void test(int* arr[5])//ok?錯!傳遞的是乙個指標,而非陣列。
{}void test(int (*arr)[5])//ok?對! (*arr)指向具有5個整形元素的陣列的指標。
{}void test(int **arr)//ok?錯!
{}int main()
; test(arr);
}
void test(char **p)
int main()
《C與指標》 高階指標話題
指標真是讓人又愛又恨。首先還是先來看一下c語言中的高階指標宣告。不要被表面迷惑最重要。c和指標 高階指標話題 int i 定義乙個整型變數 int pi 指向整型變數的指標 int ppi 指向乙個指標,而那個指標又指向乙個整型變數 高階宣告 int fun 普通函式宣告,返回乙個整數 int fu...
高階指標與陣列 函式指標,函式指標陣列等
下面與大家一起討論一下高階版的指標與陣列,是建立在大家的一級指標和一維陣列的基礎上的。存放指標的陣列。因為 操作符的優先性要高於 操作符,所以下面的均為指標陣列 int arr1 10 表示指標陣列,強調的是陣列。陣列有十個元素,是指向int型別資料的指標。char arr2 4 表示指標陣列,強調...
指標與二維陣列 高階指標入門
注意,對高階指標的學習具有兩面性,一方面可以提高工作效率,另一方面如果運用不到位的話很可能會帶來意想不到的麻煩,以下內容由淺入深逐漸分析,純屬個人探索研究,如有不足多多指正。一 二維陣列元素的指標表示形式 這裡我先定義乙個二維陣列,如下所示 int a 3 4 1000 1 1004 2 1008 ...