1. 程式人生 > >深入理解:指標陣列,陣列指標,指向指標的指標,陣列名含義

深入理解:指標陣列,陣列指標,指向指標的指標,陣列名含義

(1)指標陣列是一個數組,裡面包含若干指標,指標陣列名指向指標的地址,可賦值給指向指標的指標

   如   char* a[]={"hello" ,"world","nihao"};  char**p=a;

(2)陣列指標是一個指標,指向整個陣列

   如 int v[2][3]={{1,2,3},{4,5,6}} ;  

       int b[3]={7,8,9};

       int (*p1)[3]=v;      p1==v-->v[0]-->v[0][0]==1;

       int (*p2)[3]=&b;   p2==&b-->b-->b[0]==7;

(3)陣列名的兩層含義:既是陣列符號名(猶如 “int a=3;"中a是一個4位元組記憶體的符號名一樣),又是指向該陣列中第一個元素的地址。比如  int a[3]={1,2,3};  在*a中,a表示a[0]的地址;而在sizeof(a)中,a表示整個陣列的符號名,代表著12位元組的空間。

(4)在計算機中,訪問記憶體中的任意單元內容皆是通過地址的在組合語言中,訪問記憶體中的任何單元都是直接用地址(通常藉助%ebp,%esp等指標)的,而在c語言中,為了方便引入了符號名,一個符號代表著一塊區域,但要注意符號名本身是不佔記憶體空間的,只是在c語言的層次供程式設計師使用。比如int a=3;告訴編譯器為我分配了4位元組,以後我使用這塊空間時用a就行了,而事實上,經編譯編譯成彙編程式碼後,彙編裡對該塊區域的訪問皆是通過地址訪問的,組合語言程式碼中沒有相應的符號a

。又如,int a[3]={1,2,3}; 對應著12位元組的空間,和4個符號(a[0],a[1],a[2],a),但這4個符號都是不佔用記憶體空間的,彙編程式碼裡也沒有這4個符號。

如:

#include<stdio.h>
int main()
{
  int a[3]={1,2,3};
  int b=a[0]+a[1]+a[2];
  return b;
}

   彙編程式碼如下

.file    "test_a.c"
    .text
.globl main
    .type    main, @function
main:
    pushl    %ebp                     
    movl    %esp, %ebp                
    subl    $16, %esp                ;分配16位元組
    movl    $1, -16(%ebp)         ;對應著a[0]
    movl    $2, -12(%ebp)         ;對應著a[1]
    movl    $3, -8(%ebp)           ;對應著a[2]
    movl    -16(%ebp), %edx
    movl    -12(%ebp), %eax
    addl    %eax, %edx
    movl    -8(%ebp), %eax
    leal    (%edx,%eax), %eax
    movl    %eax, -4(%ebp)
    movl    -4(%ebp), %eax      ;對應著b
    leave
    ret
    .size    main, .-main
    .ident    "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
    .section    .note.GNU-stack,"",@progbits

(5) int v[2][3]={{1,2,3},{4,5,6}} ;  

對應著24位元組的空間和訪問該24空間的10(=6+3+1)個符號名。它們分別是:

   6個整型變數名:   v[0][0]; v[0][1]; v[0][2]; v[1][0]; v[1][1]; v[1][2];

   3個一維陣列名:      v[0],v[1],v[2]

   1個數組地址名:      v

在c語言中,當我們定義了int v[2][3]後,我們就可以在後面的程式碼中使用這個10個符號以不同的方式訪問這塊記憶體空間。

(6)抓住根本:分配的實際空間+訪問介面(符號名或地址)


相關推薦

深入理解指標陣列陣列指標指向指標指標,陣列含義

(1)指標陣列是一個數組,裡面包含若干指標,指標陣列名是指向指標的地址,可賦值給指向指標的指標。    如   char* a[]={"hello" ,"world","nihao"};  char**p=a; (2)陣列指標是一個指標,指向整個陣列。    如 int v

深入理解Redis哈希結構內存模型剖析

bsp 根據 鏈接 name 長度 string 錯誤 編碼 java 本文主要闡述 Redis中使用 最為頻繁的數據類型:哈希(或稱散列),在Redis內部是怎麽存的。 本文內容腦圖如下: 哈希類型內部編碼詳情 對於 Redis的常用 5 種數據類型(S

Android深入理解Handler + Looper + Message

宣告:本文是一篇對Handler相關內容的整理(經過相當一段時間,幾次內容增減),有相當部分內容來源網路,其中融入部分作者本身的理解,並加以整理。如有涉及到哪位老師的原作,在此深表感謝! 目錄   Handler + Looper + Message:生產者 + 消費者 + 倉

深入理解overflow:hidden——溢位,坍塌,清除浮動

基本演示程式碼: HTML程式碼: <div class="box"> <div class="box1"></div> <div class="box2"></div> </

深入理解Mysql執行SQL語句過程

開發人員基本都知道,我們的資料存在資料庫中(目前最多的是mysql和oracle,由於作者更擅長mysql,所以這裡預設資料庫為mysql),伺服器通過sql語句將查詢資料的請求傳入到mysql資料庫。資料庫拿到sql語句以後。都是進行了哪些操作呢?這裡向大家介紹下我

深入理解指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列指標

/指標陣列 示例:char *a[4] 理解:定義了一個數組,而它的每個元素的型別是一個指向字元/字串的指標。 元素表示:char *a[i]   char *(a[i])是一樣的,因為[]優先順序高

【C語言】用結構體陣列指標完成有三個學生資訊存放在結構體陣列要求輸出全部資訊

//用結構體陣列指標完成:有三個學生資訊,存放在結構體陣列中,要求輸出全部資訊 #include <stdio.h> struct Stu { int num; char name[2

C/C++程式設計學習筆記二C語言的函式中如何使用指標交換兩個數的值深入理解指標

 使用外部函式交換兩個變數的值,一個再簡單不過的事情,但是在C/C++中,正確實現該功能反應了你對指標和引用等重要知識的掌握程度。本文列舉了幾種常見的寫法,其中前三種是錯誤的,後兩種是正確的。第四種使

深入理解C語言中的指標陣列指標

前言          其實很早就想要寫一篇關於指標和陣列的文章,畢竟可以認為這是C語言的根本所在。相信,任意一家公司如果想要考察一個人對C語言的理解,指標和陣列絕對是必考的一部分。          但是之前一方面之前一直在忙各種事情,一直沒有時間靜下心來寫這些東西,畢竟

簡單理解指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列指標

簡單理解—指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列的指標 指標陣列 指標陣列,顧名思義是”指標的陣列”,首先這個變數是一個陣列,其次,”指標”修飾這個陣列,意思是說這個陣列的所有元素都是指標型別,在32位系統中,指標佔四個位元組。

leetcode713+子陣列小於K是多少個滑動視窗指標

class Solution { public: int numSubarrayProductLessThanK(vector<int>& nums, int k)

建立一個物件陣列內放5個學生的資料(學號成績)指向物件的指標做函式引數在max函式中找出5個學生中成績最高者並輸出其學號。

原始碼如下:主要注意友元函式的宣告 #include <iostream> #include <string> using namespace std; class Student { public:     Student(string n,flo

C++的函式中如何使用指標交換兩個數的值深入理解指標

使用外部函式交換兩個變數的值,一個再簡單不過的事情,但是在C/C++中,正確實現該功能反應了你對指標和引用等重要知識的掌握程度。本文列舉了幾種常見的寫法,其中前三種是錯誤的,後兩種是正確的。第四種使用的是指標,第五種使用的是引用。請看下面五個簡單的函式: #include&

理解 指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列指標

一、指標陣列與陣列指標先看兩行程式碼,猜猜哪個是陣列,哪個是指標int *p[5];int (*p)[5];有沒有很簡單,但是有很多初學者很是分不清楚;第一個是指標陣列,第二個是陣列指標。且看小僧給大家捋一捋,首先要明白符號優先順序問題,“[ ]”的優先順序高於“*”,所

C++學習筆記(三)--函式引數陣列函式指標和const,二維陣列函式遞迴函式指標

C++ Primer Plus學習筆記之三 每一塊寫了一個詳細闡釋的demo,具體使用方法以及注意事項在程式碼裡都有備註 第七章函式--C++的模組程式設計,總計分為以下幾塊-- 函式引數

什麼是陣列從二進位制到多重連結串列深入理解資料組合的內部機制

陣列是一種簡單的資料集結方式 10100001 10110011      在計算機內部這些二進位制對應著“開關”的“ON”和“OFF”;平時我們寫的程式碼最終被解釋翻譯成二進位制的“機器語言”,歸根結底所有的資料都是0和1的組合;這些0和1如同一個個雞蛋被

結構體陣列平均成績指標的三種表示方法

一個結構體陣列中存放有若干學生的資訊,每個學生有若干門課程的成績,計算每個學生的平均成績,並根據平均成績由高到低的順序輸出每個學生的學號、姓名、和平均成績(下面的程式碼裡面用指標的三種表示方法實現輸出); #include <iostream> u

JS陣列操作賦值指向同一指標

錯誤的實現: var array1 = new Array("1","2","3"); var array2; array2 = array1; array1.length = 0; alert(array2); //返回為空 這種做法是錯的,因為javascrip

指標來把陣列從小到大排列輸出程式碼VC++

昨日見旁邊一兄弟在默默練習C語言,驚奇發現他竟然用了返回指標的函式(如此高階的用法),來做陣列大小順序輸出。 佩服不已,自己也練了練: 乍一看挺麻煩的,不過思路清晰,就很好完成。思維方式,智商在一定程度上決定了程式碼精巧程度,我第一個思路只能想到用返回int值來寫