天天看點

c語言 | 那些年指針的那些事!指針

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-通過`一進制運算符 *`,來傳回指定位址的值
           
c語言 | 那些年指針的那些事!指針

注意:

*ip

就是代表

ip

存放的位址指向的變量

這裡ip指向的變量是var

即 *ip <<==>>var

是以

printf("ip指向變量的值是d%",*ip) ;
等價于
printf("ip指向變量的值是d%",var) ;
           

c中的空指針null

在變量聲明的時候,如果沒有明确的位址,那麼可以賦一個null,為指針指派null隻一個良好的程式設計習慣

空指針null,是一個定義在标準庫中值為0的常量,請看下列的程式

c語言 | 那些年指針的那些事!指針

在大多數的作業系統上,程式不允許通路位址為 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

示例圖

c語言 | 那些年指針的那些事!指針

指針的數組

在我們講解指針數組的概念之前,先讓我們來看一個執行個體,它用到了一個由 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
           

指向指針的指針

指向指針的指針是一種多級間接尋址的形式,或者說是一個指針鍊。通常,一個指針包含一個變量的位址。當我們定義一個指向指針的指針時,第一個指針包含了第二個指針的位址,第二個指針指向包含實際值的位置。

c語言 | 那些年指針的那些事!指針

一個指向指針的指針變量必須如下聲明,即在變量名前放置兩個星号。例如,下面聲明了一個指向 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
           

相關連結

指針的算數運算

指針的數組

指向指針的指針

傳遞指針給函數

從函數傳回指針

繼續閱讀