內存中每一個字節都有一個編號,這個編號叫做地址。
1 scanf("%d",&a);
首先,將a的地址給scanf函數,然后函數先把a的地址保存起來,然后從鍵盤接收數據通過存儲的a的地址保存到a變量中。
指針是存放地址的:
1 int *i_pointer; 2 i_pointer=&i; 3 //假設i的地址為0x001,則i_pointer中存放的是0x001。
* 叫做取值操作符;& 叫做取址操作符
指針和指針變量:把一個變量的地址稱為指針,c語言中的一些特殊的變量專門存放變量的地址稱這些變量稱為指針變量。
1 int i=2000; //定義一個變量 2 int *i_pointer;//定義一個指針變量 這里的*表示i_pointer是一個指針變量 3 i_pointer=&i;//&i是將i的地址賦值給指針變量i_pointer 4 printf("%d\n",*i_pointer);//輸出值為2000,這里的*表示指針,即可以通過指針變量里面i的地址取到i變量的值
舉例分析:
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int a,b; //定義兩個變量a,b 6 int *i_pointer1,*i_pointer2;//定義兩個指針變量i_pointer1,i_pointer2 7 a=100; 8 b=10; //給a b 變量分別賦值 9 i_pointer1=&a; 10 i_pointer2=&b;//將a和b變量的地址分別賦值給兩個指針變量 11 printf("%d,%d\n",a,b);//輸出a,b的值 12 printf("%d,%d\n",*i_pointer1,*i_pointer2);//通過指針找到指針變量中的a和b的地址然后得到值 13 return 0; 14 }
示意圖如下:
例題:
一:
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 //輸入a和b兩個整數,按照先大后小的順序輸出 6 7 int *p1,*p2,*p,a,b; //定義三個指針變量和兩個變量 8 scanf("%d,%d",&a,&b);//從鍵盤輸入兩個數並進行接收,加地址符是為了改變a和b的值 9 p1=&a;//將a的地址值賦值給指針變量p1 10 p2=&b;//將b的地址值賦值給指針變量p2 11 if(a<b){//將a和b進行比較 12 p=p1; 13 p1=p2; 14 p2=p;//進行交換如果a<b的話,將a的地址值賦值給p2,b的地址值賦值給p1 15 } 16 printf("a=%d,b=%d\n",a,b);//輸出a和b的值 17 printf("max=%d,min=%d\n",*p1,*p2);//通過指針找到指針變量里面存儲的地址然后取值,輸出最大最小值 18 return 0; 19 }
然后將上邊的比較函數拆分出來,通過傳入指針;
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 //輸入a和b兩個整數,按照先大后小的順序輸出 6 void max(int *p1,int *p2); 7 int *p1,*p2,a,b; //定義三個指針變量和兩個變量 8 scanf("%d,%d",&a,&b);//從鍵盤輸入兩個數並進行接收,加地址符是為了改變a和b的值 9 10 p1=&a;//將a的地址值賦值給指針變量p1 11 p2=&b;//將b的地址值賦值給指針變量p2 12 if(a<b){//將a和b進行比較 13 max(p1,p2);//傳遞的參數為指針變量 14 } 15 printf("a=%d,b=%d\n",a,b);//輸出a和b的值 16 printf("max=%d,min=%d\n",*p1,*p2);//通過指針找到指針變量里面存儲的地址然后取值,輸出最大最小值 17 return 0; 18 } 19 void max(int *p1,int *p2){ //p1為指針變量 加*則指向變量 20 int p; 21 p=*p1;// p=a 22 *p1=*p2;//a=b 23 *p2=p;//b=p 24 }
二:輸入三個數:
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 //輸入a和b和c三個整數,按照先大后小的順序輸出 6 void max(int *p1,int *p2); 7 int *p1,*p2,*p3,a,b,c; //定義三個指針變量和兩個變量 8 scanf("%d,%d,%d",&a,&b,&c);//從鍵盤輸入兩個數並進行接收,加地址符是為了改變a和b的值 9 10 p1=&a;//將a的地址值賦值給指針變量p1 11 p2=&b;//將b的地址值賦值給指針變量p2 12 p3=&c;//將c的地址值賦值給指針變量p3 13 if(a<b){//將a和b進行比較 14 max(p1,p2);//傳遞的參數為指針變量 15 } 16 if(a<c){ 17 max(p1,p3); 18 } 19 if(b<c){ 20 max(p2,p3); 21 } 22 printf("a=%d,b=%d,c=%d\n",a,b,c);//輸出a和b的值 23 //printf("max=%d,min=%d\n",*p1,*p2);//通過指針找到指針變量里面存儲的地址然后取值,輸出最大最小值 24 return 0; 25 } 26 void max(int *p1,int *p2){ //p1為指針變量 加*則指向變量 27 int p; 28 p=*p1;// p=a 29 *p1=*p2;//a=b 30 *p2=p;//b=p 31 }
指針與數組:
1 int a[10]; //定義一個一維數組 2 int *p;//定義一個指針 3 p=&a[0];//將數組中第0個元素的地址賦值給指針,注意p=a等同於p=&a[0]
如圖所示:
====================================================================================================================================================
定義一個數組,用三種方式輸出數組中的元素:
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 //定義一個數組,按照下標法輸出 6 int i,a[10]; 7 printf("請輸入十個數:\n"); 8 for(i=0;i<10;i++){ 9 scanf("%d",&a[i]); 10 } 11 //通過下標輸出 12 for(i=0;i<10;i++){ 13 printf("%d",a[i]); 14 } 15 //通過計算數組元素的地址找到元素 16 for(i=0;i<10;i++){ 17 printf("%d",*(a+i));//&a[i]可以用(a+i)表示 18 } 19 return 0; 20 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 //定義一個數組,按照下標法輸出 6 int i,a[10],*p; 7 printf("請輸入十個數:\n"); 8 for(i=0;i<10;i++){ 9 scanf("%d",&a[i]); 10 } 11 //指針變量指向數組元素 12 for(p=a;p<(a+10);p++){ //p指向數組的首地址 13 printf("%d",*p);// 14 } 15 return 0; 16 }
指針與二維數組:
1 //輸入指定的行號和列號輸出對應的值 2 #include <stdio.h> 3 #include <stdlib.h> 4 int main() 5 { 6 int (*p)[3];//定義一個二維數組的指針 7 int i,j; 8 int a[2][3]={{1,2,3},{4,5,6}}; 9 p=a;//指針指向首地址 10 printf("請輸入行號:\n"); 11 scanf("%d",&i); 12 while(i>=2){ 13 printf("請重新輸入行號,輸入值不合法。"); 14 } 15 printf("請輸入列號:\n"); 16 scanf("%d",&j); 17 while(j>=3){ 18 printf("請重新輸入列號,輸入值不合法。"); 19 } 20 printf("\n"); 21 printf("a[%d][%d]=%d\n",i,j,*(a[i]+j)); 22 return 0; 23 }
指向函數的指針變量:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #if(0) 4 int main() 5 { 6 int max(int,int); 7 int a,b,c; 8 printf("請輸入a和b:"); 9 scanf("%d,%d",&a,&b); 10 c=max(a,b); 11 printf("max=%d\n",c); 12 return 0; 13 } 14 int max(int x,int y){ 15 int z; 16 if(x>y){ 17 z=x; 18 }else{ 19 z=y; 20 } 21 return z; 22 } 23 #endif 24 25 #if(1) 26 int main() 27 { 28 int max(int,int); 29 int (*p)(int,int);//定義一個指向函數的指針 30 int a,b,c; 31 p=max;//指針變量p指向函數,將函數的入口地址賦值給指針變量 32 printf("請輸入a和b:"); 33 scanf("%d,%d",&a,&b); 34 c=(*p)(a,b);//通過指針變量調用函數 35 printf("max=%d\n",c); 36 return 0; 37 } 38 int max(int x,int y){ 39 int z; 40 if(x>y){ 41 z=x; 42 }else{ 43 z=y; 44 } 45 return z; 46 } 47 #endif
用指向函數的指針做函數參數:
1 #include <stdio.h> 2 #include <stdlib.h> 3 //用指向函數的指針做函數參數 4 #if(1) 5 int main() 6 { 7 int func(int x,int y,int (*p)(int,int)); 8 int max(int,int); 9 int min(int,int); 10 int add(int,int); 11 int a=34,b=21,n; 12 printf("請輸入1,2,3:"); 13 scanf("%d",&n); 14 if(n==1) func(a,b,max); 15 else if(n==2) func(a,b,min); 16 else if(n==3) func(a,b,add); 17 return 0; 18 } 19 20 int func(int x,int y,int (*p)(int,int)){ 21 int result; 22 result=(*p)(x,y); 23 printf("%d\n",result); 24 return 0; 25 } 26 int max(int x,int y){ 27 int z; 28 if(x>y){ 29 z=x; 30 }else{ 31 z=y; 32 } 33 return z; 34 } 35 36 int min(int x,int y){ 37 int z; 38 if(x>y){ 39 z=y; 40 }else{ 41 z=x; 42 } 43 return z; 44 } 45 46 int add(int x,int y){ 47 int z; 48 z=x+y; 49 return z; 50 } 51 #endif