這一章節很重要,一定要多思考、理解!
指標是一種儲存變數地址的變數。
通常的機器 都有一系列連續編號或編址的儲存單元。一個位元組可存char型別,兩相鄰位元組儲存單元可存一個short,依此類推。
p = &c; //將c的地址賦值給p,即p是指向c的指標。
地址運算子&只能應用於記憶體中的物件,即變數與陣列元素,不能作用於表示式、常量或register型別的變數。
1 #include <stdio.h> 2 main(){ 3 int x = 1, y = 2,z[10]; 4 int *ip; //ip是指向int型別的指標 5 ip = &x; //ip指向x 6 y = *ip; //y=1 7 printf("%d\n",y); //1 8 *ip = 0; //x=0 9 printf("%d\n",x); //0 10 printf("%d\n",y); //1 11 ip = &z[0]; //ip指向z[0] 12 printf("%d\n",ip); //2686720 陣列z的第一個元素的地址的值 14 }
1 #include <stdio.h> 2 main(){ 3 int x = 1, y; 4 int *ip; 5 int *z; 6 ip = &x; 7 printf("%d\n", *ip); //1 8 y = *ip + 1; 9 printf("%d\n",y); //2 10 *ip += 1; 11 printf("%d\n",*ip); //2 12 printf("%d\n",(*ip)++); //2 13 printf("%d\n",++(*ip)); //4 14 z = ip; //指標z也指向ip所指向的物件 15 printf("%d\n", *z); //4 16 }
1 #include <stdio.h> 2 3 main(){ 4 int i; 5 int a[10]; 6 int *p; 7 p = &a[0]; 8 printf("%d\n", &i); //2686780 9 printf("%d\n", a); //2686720 10 printf("%d\n", &a[0]); //2686720 11 printf("%d\n", &a[8]); //2686720 int按4位元組算,&a[8] = 2686720 + 8 * 4 12 printf("%d\n", p); //2686720 13 }
指標只能指向某種特定型別的物件,即每個指標都必須指向某種特定的資料型別。有一例外,void 型別的指標可存放指向任何型別的指標,但不能間接引用其自身。
//交換兩值
1 #include <stdio.h> 2 void swap(int *px, int *py); 3 main(){ 4 int i = 1, j = 2; 5 printf("%d,%d\n", i, j); //1,2 6 swap(&i, &j); 7 printf("%d,%d\n", i, j); //2,1 8 } 9 void swap(int *px, int *py){ 10 int temp; 11 temp = *px; 12 *px = *py; 13 *py = temp; 14 }
一般來說,用指標編寫的程式比用陣列下標編寫的程式執行速度要快。
int a[10]; //定義一個由10個物件組成的集合,這10個物件儲存在相鄰的記憶體區域中 ,分別為a[0] 、a[1]...
int *p;
p = &a[0]; //將指標p指向陣列第一個元素,p的值是陣列元素a[0] 的地址
//如果p指向陣列中的某個特定元素,則p+1將指向下一個元素,p+i將指向p所指向陣列元素之後的第i個元素。
//p指向a[0] ,*(p+1)引用的是陣列元素a[1]的內容,*(p+i)=a[i]。
p = &a[0]; => p = a(陣列名所代表的就是該陣列的第一個元素的地址) => a[i] = *(a+i) => &a[i] = a+i
有點困,有點饒暈了,今晚學的有點少了,明天繼續。晚安!
原文作者:lltong