tags:
-
c
categories:
-
c
date: 2020-3-2 15:38:00
toc: true
cover: https://img-blog.csdnimg.cn/20200309214024258.png
-
目錄
- 指針
-
- 什麼是指針
-
- 指針的聲明
- 指針的使用
- c中的空指針null
- 指針的算數運算
- 指針的數組
- 指向指針的指針
- 相關連結
指針
什麼是指針
指針的聲明
type *var-name
例如
int *ip //整型
double *dp //double類型
float *fp // 浮點型
char *ch // 字元型
不同資料類型之間的唯一差異是 :
指針指向的
變量
或
常量
的資料類型不同
注意:
在聲明或者定義指針變量的時候
比如
int * p ;
//僅僅是代表定義一個變量p,類型是 int * (int表示是一個整型變量,*而且是一個僅僅能放位址的變量)
一個變量的存放的内容是一個位址,不就是一個指針變量嘛
上述僅僅是定義一個變量而已
沒有對這個變量操作
指針的使用
指針變量也是一個變量,這個變量存放的值是另一個變量的位址,就如同一般的變量或者常量一樣
在使用指針之前需要特别說明這個變量是指針變量,畢竟很特殊相對于一般的變量
使用指針會頻繁經曆這樣的幾個過程
1-定義一個指針變量
2-把變量的位址給這個指針變量
3-通路這個指針變量指向的變量的值,
4-通過`一進制運算符 *`,來傳回指定位址的值
注意:
*ip
就是代表
ip
存放的位址指向的變量
這裡ip指向的變量是var
即 *ip <<==>>var
是以
printf("ip指向變量的值是d%",*ip) ;
等價于
printf("ip指向變量的值是d%",var) ;
c中的空指針null
在變量聲明的時候,如果沒有明确的位址,那麼可以賦一個null,為指針指派null隻一個良好的程式設計習慣
空指針null,是一個定義在标準庫中值為0的常量,請看下列的程式
在大多數的作業系統上,程式不允許通路位址為 0 的記憶體,因為該記憶體是作業系統保留的。然而,記憶體位址 0 有特别重要的意義,它表明該指針不指向一個可通路的記憶體位置。但按照慣例,如果指針包含空值(零值),則假定它不指向任何東西。
如需檢查一個空指針,您可以使用 if 語句,如下所示:
if(ptr) /* 如果 p 非空,則完成 */
if(!ptr) /* 如果 p 為空,則完成 */
注意:
當在 定義
指針p的時候,*p 應該當作一個整體,就是一個變量而已,隻不過這個變量是指針變量
指針的算數運算
c指針指的是一個用數值表示的位址,而c指針變量指的是一個一個值為位址的變量
這種運算其實是一種位置的移動
往前移動
往後移動
是以可以對c指針進行數值運算 ++ ,–, +, -
假設 ptr是一個指向位址 1000的整型指針,是一個32位的整數
進行下列運算
表示ptr往前移動了一次,每一次是4個子節,是以就是
結果是運作完後,ptr指向1004
因為ptr每運作一次,都指向下一個整數的位置,32位即4個子節
這個運算不會影響到記憶體中實際值
如果ptr指向的是一個1000的字元,一個字元類型占 1個子節,是以下個字元指向的字元位置是 1001
示例圖
指針的數組
在我們講解指針數組的概念之前,先讓我們來看一個執行個體,它用到了一個由 3 個整數組成的數組:
執行個體
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i;
for (i = 0; i < MAX; i++)
{
printf("Value of var[%d] = %d\n", i, var[i] );
}
return 0;
}
當上面的代碼被編譯和執行時,它會産生下列結果:
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
可能有一種情況,我們想要讓數組存儲指向 int 或 char 或其他資料類型的指針。下面是一個指向整數的指針數組的聲明:
在這裡,把 ptr 聲明為一個數組,由 MAX 個整數指針組成。是以,ptr 中的每個元素,都是一個指向 int 值的指針。下面的執行個體用到了三個整數,它們将存儲在一個指針數組中,如下所示:
執行個體
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, *ptr[MAX];
for ( i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; /* 指派為整數的位址 */
}
for ( i = 0; i < MAX; i++)
{
printf("Value of var[%d] = %d\n", i, *ptr[i] );
}
return 0;
}
當上面的代碼被編譯和執行時,它會産生下列結果:
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
您也可以用一個指向字元的指針數組來存儲一個字元串清單,如下:
執行個體
#include <stdio.h>
const int MAX = 4;
int main ()
{
const char *names[] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali",
};
int i = 0;
for ( i = 0; i < MAX; i++)
{
printf("Value of names[%d] = %s\n", i, names[i] );
}
return 0;
}
當上面的代碼被編譯和執行時,它會産生下列結果:
Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali
指向指針的指針
指向指針的指針是一種多級間接尋址的形式,或者說是一個指針鍊。通常,一個指針包含一個變量的位址。當我們定義一個指向指針的指針時,第一個指針包含了第二個指針的位址,第二個指針指向包含實際值的位置。
一個指向指針的指針變量必須如下聲明,即在變量名前放置兩個星号。例如,下面聲明了一個指向 int 類型指針的指針:
int **var;
當一個目标值被一個指針間接指向到另一個指針時,通路這個值需要使用兩個星号運算符,如下面執行個體所示:
#include <stdio.h>
int main ()
{
int var;
int *ptr;
int **pptr;
var = 3000;
/* 擷取 var 的位址 */
ptr = &var;
/* 使用運算符 & 擷取 ptr 的位址 */
pptr = &ptr;
/* 使用 pptr 擷取值 */
printf("Value of var = %d\n", var );
printf("Value available at *ptr = %d\n", *ptr );
printf("Value available at **pptr = %d\n", **pptr);
return 0;
}
當上面的代碼被編譯和執行時,它會産生下列結果:
Value of var = 3000
Value available at *ptr = 3000
Value available at **pptr = 3000
相關連結
指針的算數運算
指針的數組
指向指針的指針
傳遞指針給函數
從函數傳回指針