C語言指針運算不理解?深入淺出通俗易懂,一題吃透指針與數組

c語言基礎 發佈 2020-05-04T02:29:33+00:00

int array[3][4] = }*)代表 array[0][1] ,故列印2; 移動的字節數: pArray+sizeof*1,表示第一行第一個位置的地址,故** 得到的應該是第1行第一個元素,即列印5pArray++後 pArray示第一行第一個位置的地址 ,而在數組中


前言

本文主要介紹的是C語言指針知識,希望對於廣大讀者學習C語言有一些幫助。深入了解C語言指針小知識,先看題算結果:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
        int  array[3][4] = 
        { 1, 2, 3,
                4, 5, 6, 
                7, 8, 9, 
                10, 11, 12
        };
        int(*pArray)[4] = array;
        printf("%d ", *(pArray[0] + 1));
        printf("%d ", **(pArray + 1));
        pArray++;
        printf("%d ", *(*pArray + 1));
        system("pause");
        return 0;
}

指針,是C語言中的一個重要概念及其特點,也是掌握C語言比較困難的部分,這道題目就很有效的考驗了一個人對於指針的運算與C語言數組的掌握。

知識解析

主要使用到的知識如下:

  1. C語言數組指針: 一個指向數組的指針
  2. C語言中指針如何表示二維數組
  3. C語言指針的的運算: p+n的理解

數組指針

即是指向數組的指針。例:int (*p)[4]; p即為指向數組的指針,又稱數組指針。數組指針是指向數組地址的指針,其本質為指針;指針數組是數組元素為指針的數組(例如 int *p[3],定義了p[0],p[1],p[2]三個指針),其本質為數組。數組指針的使用在某些情況下與指針數組很相似,要注意區別。

指針如何表示數組

一維數組中有如下重點:

當一級指針p指向數組array時,*(p+i)等效於array[i] 等效於p[i]

二維數組中有如下重點:

C語言指針運算

指針p+n 解釋為: p+sizeof(指針所指向的類型)*n;說到這裡不得不講下C語言指針中的兩個重要類型了。如果存在指針 int *p 則有如下兩個類型:

  1. 指針的類型: 去掉變量 ,剩下的就是類型,故是 int *;
  2. 指針所指向的類型: 去掉*和變量名即可得到地址對應的內存中的存儲的數據類型,即int類型。

故對於 int(*p)[3] 的p+1操作 應該理解為:p+sizeof(int[3])*1;

題目分析:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
        int  array[3][4] = 
        {   1, 2, 3,4,
            5, 6, 7,8,
                  9, 10, 11, 12
        };
        int(*pArray)[4] = array;
        printf("%d ", *(pArray[0] + 1));
        printf("%d ", **(pArray + 1));
        pArray++;
        printf("%d", *(*pArray + 1));
        system("pause");
        return 0;
}

*(pArray[0] + 1))代表 array[0][1] ,故列印2;

(pArray + 1) 移動的字節數: pArray+sizeof(int[4])*1,表示第一行(數組從第0行開始計數)第一個位置的地址,故**(pArray + 1) 得到的應該是第1行第一個元素,即列印5

pArray++後 pArray示第一行(數組從第0行開始計數)第一個位置的地址 ,而在數組中p[0] 並不一定表示第0行或者第0列哦,而是以p的當前地址中的偏移位置,故*(*pArray + 1)代表當前地址的第1個元素,故列印6 。綜上列印結果是2 5 6 。

運行測試


尾言

文章都是手打原創,每天最淺顯的介紹C語言、C++,windows知識,喜歡我的文章就關注一波吧,每天帶你學習C/C++不同的知識,也可以看到最新更新和之前發表的文章哦。如果足下基礎比較差,不妨關注下人人都可以學習的視頻教程

通俗易懂,深入淺出,一個視頻只講一個知識點。視頻不深奧,不需要鑽研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢

如果今天學到知識的,可以再留言區留言學到了哦,如果喜歡可以一鍵三連哦,這真的對我很重要!!

關鍵字: