標籤:記憶體 變化 stdio.h 著作權 定義 目錄 view include art
著作權聲明:本文出自阿鐘的部落格,轉載請註明出處:http://blog.csdn.net/a_zhon/。
目錄(?)[+]
一.什麼是指標?
簡單來說: 指標就是記憶體位址 記憶體位址就是指標。來看個小案例
#include<stdio.h>#include<stdlib.h>/** 指標就是記憶體位址 記憶體位址就是指標 */main() { //定義一個int類型的變數i,並且賦值為10 int i=10; //定義一個int類型的一級指標變數p int* p; //把i對應的地址給p變數 p=&i; //指標取值*p:把p變數地址對應的值取出來 printf("*p=%d\n",*p); //列印地址值 printf("p的地址值%#x\n",p); system("pause");}
總結:p儲存的是一個地址值,而*p就是去取地址值所對應的值。二.下面通過四個小案例來加深對指標和指標變數的理解,我們先說一下指標和指標變數的區別:
- 指標就是記憶體位址,記憶體位址就是指標
- 記憶體位址就是記憶體單元的編號
- 指標變數就是存放記憶體位址的變數
- 指標和指標變數是兩個完全不同的概念
1.第一個例子,如果修改i的值,p值有變化嗎?
#include<stdio.h>#include<stdlib.h>main() { int i=100; //p就是我們的指標變數,存放地址值 int *p=&i; printf("i值修改之前,p的地址值是%#x\n",p); i=200; printf("i值修改之後,p的地址值是%#x\n",p);}
答案是沒有變化的:因為此時修改了i值,p引用的還是i的地址所以p不會有變化2.第二個例子,如果修改p的值,i值有變化嗎?
#include<stdio.h>#include<stdlib.h>main() { int i=100; int *p=&i; printf("p值修改之前,i的值是%d\n",i); int j=200; p=&j; printf("p值修改之後,i的值是%d\n",i);}
答案是沒有變化的:因為此時將j的地址給了p,而i並沒有動所以i的值不變3.第三個例子,如果修改i的值,*p值有變化嗎?
#include<stdio.h>#include<stdlib.h>main() { int i=100; int *p=&i; printf("i值修改之前,*p的值是%d\n",*p); i=200; printf("i值修改之後,*p的值是%d\n",*p);}
答案是有變化的:因為此時修改了i值,*p引用的是i的地址指向的值,所以*p的值發生了改變4.第四個例子,如果修改*p的值,i值有變化嗎?
#include<stdio.h>#include<stdlib.h>main() { int i=100; int *p=&i; printf("*p值修改之前,i的值是%d\n",i); *p= 200; printf("*p值修改之後,i的值是%d\n",i);}
答案是有變化的:因為*p=200;此時是將*p引用的值修改為200,也就是修改了i的值。三:”*”號的三種含義
- 數學運算子:3 * 7 = 21
- 定義指標變數:int* p;
- 指標運算子(取值):*p表示取p對應記憶體位址對應的值
四:操作記憶體位址實現將兩個數進行互換
1.第一種:使用中間變數來互換,這一種也是我們最常用的一種方法
#include<stdio.h>#include<stdlib.h>/** 互換兩個數 */main() { int a = 100; int b = 150; //通過一個中間變數來互換 int temp = a; a = b; b = temp; printf("a的值:%d\n",a); printf("b的值:%d\n",b); system("pause");}
2.第二種:我們知道C語言是可以直接操作記憶體的,所以我們可以直接來改變a,b兩個的記憶體位址指向的值。
#include<stdio.h>#include<stdlib.h>/** 互換兩個數 *///通過互換兩個數的地址值,來互換數字void changeAdress(int* a,int* b) { //temp取的是指標變數a對應的記憶體位址的值也就是100 int temp = *a; //把a對應記憶體位址的值 修改為b對應記憶體位址的值 *a = *b; //把b對應記憶體位址的值 修改為temp *b = temp;}main() { int a = 100; int b = 150; //分別將取a,b的地址 changeAdress(&a,&b); printf("a的值:%d\n",a); printf("b的值:%d\n",b); system("pause");}
五:函數返回多個值
#include<stdio.h>#include<stdlib.h>/** 函數返回多個值 通過修改指標變數引用的值,達到返回多個值的效果。 */void close(int* a,int* b) { *a=0; *b=0;}main() { int a=1; int b=1; //調用函數 close(&a,&b); printf("a=%d\n",a); printf("b=%d\n",b); //是docs視窗停留 system("pause");}
總結起來其實並不難,互換就是將 a原來指向100改成指向150,將 b原來指向150改成指向100;也就是說a,b的地址並沒有改變,改變的是他們的值;好了到這裡對指標,指標變數的初步認識就講完了。
Android JNI編程(三)——C語言指標的初步認識、指標變數、互換兩個數、函數返回多個值