Android JNI編程(三)——C語言指標的初步認識、指標變數、互換兩個數、函數返回多個值

來源:互聯網
上載者:User

標籤:記憶體   變化   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. 指標就是記憶體位址,記憶體位址就是指標
  2. 記憶體位址就是記憶體單元的編號
  3. 指標變數就是存放記憶體位址的變數
  4. 指標和指標變數是兩個完全不同的概念
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的值。三:”*”號的三種含義
  1. 數學運算子:3 * 7 = 21
  2. 定義指標變數:int* p;
  3. 指標運算子(取值):*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語言指標的初步認識、指標變數、互換兩個數、函數返回多個值

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.