程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 對C說話中指針的懂得與其基本應用實例

對C說話中指針的懂得與其基本應用實例

編輯:關於C++

對C說話中指針的懂得與其基本應用實例。本站提示廣大學習愛好者:(對C說話中指針的懂得與其基本應用實例)文章只能為提供參考,不一定能成為您想要的結果。以下是對C說話中指針的懂得與其基本應用實例正文


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的值。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved