a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

對C語言中指針的理解與其基礎使用實例

2020-01-26 14:41:49
字體:
來源:轉載
供稿:網友

C語言的指針,關鍵意思在于“指”。

“指”是什么意思?
其實完全可以理解為指示的意思。比如,有一個物體,我們稱之為A。正是這個物體,有了這么個稱謂,我們才能夠進行脫離這個物體的實體而進行一系列的交流。將一個物體的指示,是對這個物體的抽象。有了這種抽象能力,才有所謂的智慧和文明。所以這就是“指示”這種抽象方法的威力。

退化到C語言的指針,指針是一段數據/指令(在馮諾易曼體系中,二者是相通,在同一空間中的)的指示。這是指示,也就是這段數據/指令的起始位置。但是數據/代碼是需要一個解釋的方法的。比如0x0001,可以作為一個整數,也可以作為作為一串指令,也可以作為一串字符,總之怎樣解釋都可以。

而C語言,在編譯階段,確定了這段數據/指令的“解釋方法”。
例如,整型指針,表示的就是可以從這個指針p指向的位置開始解釋,解釋為一個整數。
一個函數指針,表示的就是可以從這個指針p指向的位置開始解釋,解釋為一段指令,對應的輸入和輸出以及返回值按照函數指針的類型,符合相應的要求。

綜上,C語言的精髓是指針,但指針不僅僅是C語言的精髓,它是抽象的精髓。各個語言中都有類似的東西,例如函數,例如引用。

(引用和指針的區別,我的理解,不可以進行+/-偏移操作的指針,就是引用。隨意偏移,很容易使得目標位置不符合其相應的意義,從而造成解釋失敗,進而崩潰。而增加了偏移功能的指針,好處是方便表述一堆具有相同類型的數據/指令,數組之類的就是這樣的實例。)

同樣的void類型的指針,也是C語言的特色。void型的指針,就是去掉了指定類型的指針,從而使得可以以任意解釋方式,解釋指針,這就帶來了如上的潛在問題。但是也可以說,這個C語言的特有威力(我一般都把C語言的威力理解為這個)。這個帶來的好處非常之靈活。因為可以使用統一的類型來表述所有類型的數據。帶來的問題,和上面是類似的。就是如果解釋方法不當,就會造成災難性的后果。C語言的強制類型轉換也是打破常規的指針解釋.也有可能帶來問題.

下面來看一下關于指針的一些基礎知識:

1. 基礎

int i = 10; int *p = &i; /* 定義一個指向int類型的指針p,并把i的地址賦給它 */ printf("i=%d, &i=%p, p=%p, *p=%d /n", i, &i, p, *p); 

程序輸出為:

i=10, &i=0x22ac44, p=0x22ac44, *p=10

&i是i的地址,指針p保存了i的地址,*p是取指針的值,也就是i的值。

2. 指針類型的參數和返回值

/* 定義一個返回值為指向int類型的指針的函數 */ int *swap(int *px, int *py) {  int temp;  temp = *px;  *px = *py;  *py = temp;  return px; } int main(void) {  int i = 10;  int j = 20;  int *m = swap(&i, &j);  printf("i=%d, j=%d, *m=%d /n", i, j, *m);  return 0; }

 

程序輸出為:

i=20, j=10, *m=20

return px相當于定義了一個int類型的臨時指針來保存px,然后再把這個指針賦給指針m,所以m的指向和px是一樣的。

3. 指針和數組

int a[5] = {1, 2, 3, 4, 5}; int *pa = &a[0]; printf("*pa=%d pa=%p a=%p /n", *pa, pa, a); pa++; printf("*pa=%d /n", *pa); 

程序輸出為:

*pa=1 pa=0x22ac28 a=0x22ac28*pa=2

數組名作為參數傳遞時,實際傳遞的是第一個元素的指針,從上面的輸入可以看出。
指針pa++是讓pa指向下一個元素。

4. 指針與const

int n = 30; const int *x = &n; int const *y = &n; printf("*x=%d y++=%p /n", *x, y++); 

程序輸出:

*x=30 y++=0x22ac1c

const int 和 int const是一樣的,都是定義一個指向const int類型的指針。所以*x是不可變的,不能執行(*x)++這樣的操作,但是x是可變的,可以執行x++的操作。

int * const z = &n; printf("++(*z)=%d /n", ++(*z)); 

程序輸出:

++(*z)=31

上面定義的是一個指向int類型的const指針,所以z是不可變的,但是指針的值是可變的。要定義都不可變的指針就是:

int const * const pz;

5. 指向指針的指針

int c = 40; int *pc = &c; int **ppc = &pc; printf("&pc=%p ppc=%p *ppc=%p **ppc=%d", &pc, ppc, *ppc, **ppc); 

程序輸出:

&pc=0x22ac0c ppc=0x22ac0c *ppc=0x22ac10 **ppc=40

*ppc取的是pc的值,而**ppc就相當于*pc,就是c的值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 久久精品极品 | 国产一区二区在线不卡 | 日韩av一区二区三区在线观看 | 99视频免费观看 | 爱爱视频在线观看 | 国产精品国产三级国产aⅴ无密码 | 亚洲黄色高清视频 | 国产精品美女久久久久高潮 | 亚洲午夜视频 | 国产中文在线 | 亚洲一区二区免费 | 日韩久久一区 | 精品国产aⅴ一区二区 | 日本一区二区高清不卡 | 亚洲一级毛片 | 久久国产精品视频 | 免费在线观看毛片网站 | 国产精品视频免费 | 国产精品欧美一区二区三区 | 欧美a在线 | 国产欧美精品一区二区三区四区 | 欧美日韩视频在线观看一区 | 国产精品一区二区在线观看免费 | 三级色网站 | 久久亚洲视频 | 国产精品视频 | 久久久久久久久国产精品 | 一区二区三区中文字幕 | 91麻豆产精品久久久 | 成人黄色片网站 | 亚洲一区二区三区免费在线观看 | 日日干天天操 | 久久一区二区视频 | 国产免费看 | h片在线免费观看 | 久久精品视频网站 | 91福利视频导航 | 成人视屏在线观看 | 搜索黄色毛片 | 狠狠色 综合色区 | 国产精品乱码一区二区三区 |