重拾C,一天一點點_9-指針與數組

這一章節很重要,必定要多思考、理解!數組

指針是一種保存變量地址的變量。spa

一般的機器 都有一系列連續編號或編址的存儲單元。一個字節可存char類型,兩相鄰字節存儲單元可存一個short,依此類推。指針

  p = &c;  //將c的地址賦值給p,即p是指向c的指針。code

地址運算符&只能應用於內存中的對象,即變量與數組元素,不能做用於表達式、常量或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 類型的指針可存放指向任何類型的指針,但不能間接引用其自身。blog

//交換兩值ip

 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+iget

有點困,有點饒暈了,今晚學的有點少了,明天繼續。晚安!博客

 

原文做者:lltong

博客園地址:http://www.cnblogs.com/lltong/

相關文章
相關標籤/搜索