學(xué)習(xí)啦 > 學(xué)習(xí)英語 > 專業(yè)英語 > 計(jì)算機(jī)英語 > c中的用法

c中的用法

時(shí)間: 長(zhǎng)思709 分享

c中的用法

  c中的用法的用法你知道嗎?下面小編就跟你們?cè)敿?xì)介紹下c中的用法的用法,希望對(duì)你們有用。

  c中的用法的用法如下:

  C中*、&用法介紹

  例1、

  復(fù)制代碼

  #include <stdio.h>

  int find(int *a);

  main()

  {

  int b = 1;

  int wait, test;

  test = find(&b);

  printf("內(nèi)存地址為:%d",&test);

  scanf("%d", &wait);

  }

  int find(int *a)

  {

  return *a;

  }

  復(fù)制代碼

  int b = 1; int test = find(&b); 這樣調(diào)用時(shí),實(shí)際上是進(jìn)行了:int* a = &b,創(chuàng)建了一個(gè)新的指向b的整型指針a作為find函數(shù)范圍內(nèi)的局部變量。

  示例二

  函數(shù)聲明:int find(int& a); 函數(shù)調(diào)用:int b = 1; int n = find(b);

  這樣調(diào)用時(shí),實(shí)際上是進(jìn)行了:int& a = b,給變量b起了個(gè)別名a,也就是說a和b實(shí)際上代表的是同一個(gè)變量,調(diào)用期間沒有創(chuàng)建任何新的變量。

  示例三

  函數(shù)聲明:int find(int a); 函數(shù)調(diào)用:int b = 1; int n = find(b);

  這樣調(diào)用時(shí),實(shí)際上是進(jìn)行了:int a = b,也就是普通的變量賦值操作,調(diào)用期間創(chuàng)建了在find函數(shù)范圍內(nèi)的局部變量a,它的值與b相同。

  &在用于計(jì)算時(shí)就是取變量地址,如int* a = &b,就是將整型變量b的地址取出,賦值給整型指針a,a中的內(nèi)容就是b的地址,所以a指向b。

  *在用于計(jì)算時(shí),就是取指針?biāo)赶虻牡刂分械闹?,如int b = *a,就是將整型指針a指向的地址中存放的內(nèi)容賦值給整型變量b。

  C語言中,&符號(hào)大家一定很熟悉吧,它除了可以作為按位運(yùn)算“與”之外還有更常用的功能——取變量地址。

  復(fù)制代碼

  #include <stdio.h>

  main()

  {

  int a = 0;

  int wait;

  int *p = &a;

  printf("The value is: %d\n", *p);

  scanf("%d", &wait);

  }

  復(fù)制代碼

  上面代碼中,指針p指向變量a的地址。在C/C++中,每個(gè)變量都有其相應(yīng)的地址,通過在變量標(biāo)識(shí)符前加&符號(hào)即可獲得變量的地址。

  那么我們這么寫可以嗎?int *p = &0x01000;

  這顯然不行。因?yàn)閷?duì)于一個(gè)數(shù)值常量,它是沒有地址的。而變量之所以有地址就是因?yàn)橐幸粋€(gè)存儲(chǔ)單元對(duì)變量進(jìn)行標(biāo)識(shí)(當(dāng)然,變量也可以直接映射到某個(gè)寄存器)。

  我們?cè)倏聪旅娴拇a:

  復(fù)制代碼

  #include "stdio.h"

  int main(void)

  {

  int a = 0; // &a = 0x0012ff60

  int *p = &*(int*)0x0012ff60;

  printf("The value is: %d\n", *p);

  return 0;

  }

  復(fù)制代碼

  上面代碼又是怎么回事呢?

  先前已經(jīng)調(diào)查過變量a的地址——0x0012ff60,那么這里的指針p實(shí)際上也是指向變量a的地址。

  首先,將0x0012ff60作類型轉(zhuǎn)換,轉(zhuǎn)為int*,即經(jīng)過(int*)0x0012ff60后,0x0012ff60轉(zhuǎn)化成了一個(gè)地址,這時(shí)它與&a是等價(jià)的。(類似的: int a = (int)(((int *)0)+4); (int*)0 已經(jīng)轉(zhuǎn)化為一個(gè)地址了,+4 就是表示在剛才地址上加4,是地址的位移操作。)

  然后*(int*)0x0012ff60表示取變量a的內(nèi)容。

  最后,&*(int*)0x0012ff60表示再脫去*(int*)0x0012ff60的解引用,相當(dāng)于又變?yōu)?int*)&a。

  因此,這里的&與第一個(gè)例子中的&是不同的語義。這里的&不是取地址,因?yàn)橐粋€(gè)*(int*)0x0012ff60不是變量,它是沒有地址的。每一個(gè)變量標(biāo)識(shí)符在編譯期間,編譯器會(huì)為它們創(chuàng)建一個(gè)符號(hào)表,其中存放著變量標(biāo)識(shí)符相應(yīng)的各種屬性,如類型、地址標(biāo)識(shí)等。地址標(biāo)識(shí)在連接后即可確定邏輯地址值。簡(jiǎn)而言之,&作為取地址操作,當(dāng)且僅當(dāng)&后面跟著的是變量或函數(shù)標(biāo)識(shí)符。所以這里的&表示脫去解引用。

  由此我們可以得出:&作為取地址操作時(shí),其行為結(jié)果是在編譯時(shí)就被確定的;而*,解引用操作(或取內(nèi)容)操作,其行為結(jié)果只能在運(yùn)行時(shí)才可被確定。

  再看下面的例子,加深印象:

  復(fù)制代碼

  #include "stdio.h"

  int main(void)

  {

  int a = 0;

  int *p = &*&*&a;

  printf("The value is: %d\n", *p);

  return 0;

  }

  復(fù)制代碼

  在C++中,&還可以表示引用,

  復(fù)制代碼

  #include "iostream"

  using namespace std;

  int main(void)

  {

  int a = 0;

  int &r = a;

  cout << "The value is: " << r << endl;

  return 0;

  }

543013