1. 程式人生 > >一維陣列與指標,二維陣列與指標,指標陣列及陣列指標的概念詳解、例項解析

一維陣列與指標,二維陣列與指標,指標陣列及陣列指標的概念詳解、例項解析

概念詳解:

指標:指標與“int a”,“float b”一樣,也是一種變數,只是指標變數中儲存的是記憶體單元的地址,這是與“int a”和“float b”的本質區別,C語言的精華就在於指標、結構體和連結串列。

一維陣列:定義一維陣列之後,即在記憶體中分配一段連續的地址空間,如C語言中,int num[5],在32位系統中,int佔據4個位元組,現假設num[0]的地址空間為0x00000004,那麼num[1]的地址空間即為0x00000008 (0x00000004 + 4),num[2]的地址空間即為0x0000000c,其餘幾個的地址空間依次類推,加4即可。

二維陣列:二維陣列其實可以看成是一個矩陣,如C語言中,int a[3][4],即可以看成是一個3行4列的矩陣,在記憶體中每一個位置儲存一個數據,用a[i][j]表示。

指標陣列:陣列元素全為指標的陣列稱為指標陣列,如C語言中,定義一個指標陣列用int  *arr[5],本質是一個數組,只是每個陣列中的內容是變數的地址,而不是變數本身。

陣列指標:通常用來指向二維陣列的指標叫陣列指標,如C語言中,int (*p)[5] , 可以用p來指向二維陣列。

例項解析:

1、一維陣列與指標

定義一個一維陣列int data[5]={2, 5, 6, 9, 8};,定義一個指標int *p;,一維陣列本質上可以用指標來處理;

    如以下程式:

   int data[5]={2, 5, 6, 9, 8};  //陣列名“data”即為陣列第0個元素的首地址

   int *p, k;

   p = data;

  for(k=0; k<4; k++)

 {

    printf("%d\n", *(p+k));  //*(p+k)即表示陣列中第k個元素的數值,也可用*(data+k)來表示,(p+k)或者(data+k)表示第k個                                                                                                                                                                        元素的記憶體地址

 }

2、二維陣列與陣列指標

     定義一個二維陣列int num[3][4], 定義一個數組指標int (*p)[3]

     二維陣列可以看成是多個一維陣列的組合,在這個定義中,資料儲存方式是三行四列,即每行有四個元素,共計三行。每行可以看做是一個一維陣列,而且每個一維陣列的首地址是num[0], num[1], num[2], 整個二維陣列的首地址是陣列名num,也是num[0][0]的地址。

     以下程式為上述概念的解釋:

      int num[3][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

      int (*p)[3];

      int m, n;

      p = num;

      for(m=0; m<3; m++)

     {

         for(n=0; n<4; n++)

        {

             printf("%d\n",  *( *(p + m) + n) );

            //這句程式碼中,最裡邊的*(p + m) + n,比如現在是*(p + 1) + 1,p指向了第0行元素,p+1即指向第一行資料,*(p + 1)指向第一行的資料,在實際程式碼這句程式碼轉化成了第一行第0個元素地址,因為使用整行資料是沒有含義的,編譯器遇到此類情況時,都會轉化成第0個元素的地址,那麼*(p + 1) + n就指向了第一行第n個元素的記憶體地址,那麼* ( *(p + m) + n) 就是取出第一行第n個元素的值

        }

     }

  這是一種利用指標取二維陣列每個元素的方法,下面介紹第二種方法:

  int num[3][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

  int m, n;

  for(m=0; m<3; m++)

  {

     for(n=0; n<4; n++)

    {

        printf("%d\n",*  ( num[m] + n ) );

       //num[0], num[1], num[2], 表示每行元素的首地址,而num[m] + n表示第m行第n列元素的地址,用取值符*,即*  ( num[m] + n )打印出每個位置的數值

    }

  }

3、指標陣列

   指標陣列本質是一個數組,只不過每個元素的內容儲存的是變數的記憶體地址。

   如程式;

  int  a[3]= {1, 2, 3};

  int  *p[3];

  int m;

  for(m=0; m<3; m++)

{

    p[m] = a + m;

}

for(m=0; m<3; m++)

{

   printf("%d\n", *p[m]);  //用取值符打印出陣列中每個元素的數值

}

相關推薦

陣列指標陣列指標指標陣列陣列指標概念例項解析

概念詳解:指標:指標與“int a”,“float b”一樣,也是一種變數,只是指標變數中儲存的是記憶體單元的地址,這是與“int a”和“float b”的本質區別,C語言的精華就在於指標、結構體和連結串列。一維陣列:定義一維陣列之後,即在記憶體中分配一段連續的地址空間,如

是否瞭解printf("%s",....)printf("%c",...)的區別指標的強制轉換成指標指標甚至多指標時如何正確使用

程式碼1:  #include <stdio.h> #define va_list void* #define va_start(arg, start) arg = (va_list)( ((char*)&start) + sizeof(start

指標陣列指標陣列

在函式傳參時候,陣列名作為引數,自動轉成指標,那麼二維陣列可不可以這樣做呢。void fun(int **a,int i,int j){int m = i*j;for (int i = 0; i < m; i++){cout << *(a[0] + i)<<endl;}}int

指標陣列的關係指標運算指向指標指標指標

#include<iostream> using namespace std; int main() { int a[5] = {0,1,2,3,4}; int *p = a; cout << a[1] << endl &

徹底搞清C/C++中陣列陣列指標陣列指標指標陣列以及指向指標指標行地址和列地址之間的關係

#include <iostream> using namespace std; void test(char **ptr) { for(;(strcmp(*ptr,"NULL"))!=0;ptr=ptr+1)        cout << *(ptr) <&l

C語言 函式返回陣列陣列

方法一: 萬能的結構體:構造陣列的結構體,將函式型別定義為此型別 但是考試的時候應該不太方便寫結構體,寫不下也會很麻煩,故介紹方法二 方法二: 指標傳遞: 1、返回一維陣列 例子:將陣列每一位加一: #include<stdio.h> #define N 10 int

陣列(隨機生成陣列陣列概念和題目設計(利用陣列 :任意給定分數去計算科目和人均平均分)

1 //陣列間的關係arr[]中的數字為幾,[]內就有幾個數 2 //{ }內的數是從0開始,如需要列印應從0開數 3 如{2,6,9,8,7}列印arr[4]就是7 4 #include <stdio.h> 5 #include <stdlib.h> 6 int

【C/C++】用指標實現陣列的傳遞使用的4種示例各種變形。

請看例程。 #include <stdio.h> #include <stdlib.h> /* *func1:用int a[]傳遞二維陣列 *func2:用int a[][10]傳遞二維陣列 *func3:用int *a[10]傳遞二維 *

指標指標指向陣列的一些問題

廢話少說,先上自己Dev c++上的程式碼: #include<stdio.h>int main (){int c[2][3]={15,2,3,4,5,6},*p,(*rp)[3],*q,i; p =(int*)c; rp=c; q=c;

C++中動態定義陣列陣列陣列

//動態定義一維陣列、二維陣列、三維陣列 #include<iostream> #include<ctime> using namespace std ; int main() { int hight , row , col ; register

簡潔明瞭C++中動態定義陣列陣列陣列

#include<iostream> #include <ctime> #include <cstdlib> using namespace std; int main() { int hight , row , col ; regis

關於陣列指標指標陣列雙重陣列矩陣字串陣列雙重字元指標的理解

1、二維陣列     int array[10][10]; 函式宣告: void fun(int a[][10])    函式呼叫:fun(array);   訪問: 一般使用a[i][j]來訪問陣列中的元素 2、指標陣列     int *array[10

01揹包的理解陣列陣列的理解(附hdu2602 Bone Collector)

01揹包問題: 有n個物品和一個容量為v的揹包,用val[i]表示第i個物品的價值,用vol[i]表示第i個物品的體積,那麼,如何使揹包裡裝的物品的總價值最大呢? 貪心是不行的,舉個反例: n=3, v=100 val[i] vol[i]

C/C++陣列陣列指標)——陣列的傳值和陣列訪問

二維陣列既可以通過二維訪問也可以通過一維訪問。 對於二維陣列的傳值,引進了陣列指標。 #include <stdio.h> void foo(int *p,int n)//一維訪問 {

JAVA菜鳥入門(9) Java列印陣列陣列

一 列印list中的元素 0 JAVA風格的最簡做法import java.util.List; ... List<Integer> l = new ArrayList(3); System.out.println(l); 1 JAVA風格的做法import j

陣列陣列陣列名的含義

1:一維陣列: int a[5];   &a是陣列的地址,故&a + 1是加一個數組大小的長度。增加20個位元組。 *(&a) = a;對一維陣列的地址取值等於陣列首元素的地址。 2:二維陣列: int a[2][2];*(*(a + i)+ j)

python 寫入csv的幾種方法總結(陣列矩陣的寫入)

轉自:https://blog.csdn.net/waple_0820/article/details/70049953最常用的一種方法,利用pandas包import pandas as pd #任意的多組列表 a = [1,2,3] b = [4,5,6] #

指向陣列指標指標

char (*a)[N];//指向陣列的指標      a = (char (*)[N])malloc(sizeof(char) * N * m);   printf("%

劍指Offer(java+第三題陣列中的查詢)

3.在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 思路:從右上角或左下角開始找,逐行刪除,或者用二分法查詢 程式碼:   public class O

C語言陣列篇(五)多級指標陣列指標的區別

多級指標   以二級指標為例 二級指標的由來是 指標陣列 的指標形式. int *p[10] 讀取的順序是 p[10] --> 10個空間的陣列 * p[10] --> 這10個空間的數組裡面存放的資