1. 程式人生 > >【 C 】指向陣列的指標(陣列指標)(行指標)

【 C 】指向陣列的指標(陣列指標)(行指標)

本博文內容參考:《C 和 指標》

本博文解決兩個問題,一是如何訪問二維陣列的行,以及元素;二是如何定義指向陣列的指標以及如何賦值等。

很簡單,快速記錄!

先給出一個案例,判斷下面這兩個宣告以及賦值合法嗎?

int vector[10], *vp = vector;

int matrix[3][10], *mp = matrix;

第一個宣告是合法的。它為一個整型陣列分配記憶體,並把vp宣告為一個指向整型的指標,並把它初始化為指向vector陣列的第一個元素。vector 和 vp具有相同的型別,都是指向整型的指標。也有區別,vp是指標變數,而vector是指標常量。

第二條宣告語句是非法的,這裡的非法是指對指標mp的賦值是不正確的,宣告本身是沒有問題的。

它正確地建立了一個matrix陣列,並把mp宣告為一個指向整型的指標。但是mp的初始化是不正確的,因為matrix並不是一個指向整型的指標常量,而是一個指向整型陣列的指標。(它指向matrix陣列的第一個元素,而這個元素又包含10個元素,更確切地說,也就是matrix指向該陣列的第一行,也就相當於一個一維陣列。)

我們怎麼樣宣告一個指向整型陣列的指標呢?

int (*p) [10];

這個宣告作為一個重新撿起c語言的人來說應該是不難的,但是對於小白來說,肯定還是會嚇出一身冷汗!

宣告也不是亂宣告的,肯定有它的道理,我們來分析下:

下標引用【】的優先順序要高於間接訪問*,但是括號的優先順序最高,所以首先執行的還是間接訪問。所以p還是一個指標,這個指標指向的是什麼呢?

接下來執行的是下標引用,所以p指向某種型別的陣列。這個宣告表示式中並沒有更多的操作符,所以陣列的每個元素都是整數。

宣告並沒有告訴你p是什麼?但推斷它的型別並不困難,當我們對它執行間接訪問操作時,我們得到的是陣列,對該陣列進行下標引用操作得到的是一個整型值。所以說,這個指標是指向整型陣列的指標。

在生宣告中加上初始化是這個樣子:

int (*p)[10] = matrix;

它使p指向matrix的第一行。

p是一個指向擁有10個整型元素的陣列的指標。當你把p與一個整數相加時,該整數值首先根據10個整型值的長度進行調整,然後執行加法。所以我們可以使用這個指標一行一行地在matrix中移動。

如果你需要一個指標逐個訪問整型元素而不是逐行在陣列中移動,你該怎麼辦?

下面兩個宣告都建立了一個簡單的整型指標,並以兩種不同的方式進行初始化,指向matrix的第一個整型元素。

int *pi = &matrix[0][0];

int *pi = matrix[0];

增加這個指標的值使它指向下一個整型元素。

相關推薦

C 指向陣列指標陣列指標指標

本博文內容參考:《C 和 指標》 本博文解決兩個問題,一是如何訪問二維陣列的行,以及元素;二是如何定義指向陣列的指標以及如何賦值等。 很簡單,快速記錄! 先給出一個案例,判斷下面這兩個宣告以及賦值合法嗎? int vector[10], *vp = vector;

C++如何使用函式進行陣列求和?傳遞陣列指標的簡單示例程式碼

cookies[Arsize] 如果是輸出輸出地址的長度,比如sizeof cookies,這時輸出的是整個陣列長度 假如傳遞給了指標arr, sizeof arr 就輸出的是指標的長度 可能理解比較抽象,我們採用實際程式碼舉例: 程式碼中有詳細註釋 //通用的統計陣列的和的

C#之 語句結構與陣列

#一、語句塊 在說語句結構和陣列之前咱們先來看看一些碎碎念——雜七雜八的語句塊 ##1、常量 常量 是程式碼中人為設定固定不變的一個元素值,聲明後可以直接使用在範圍內的程式碼當中。 常量的宣告 和變數宣告差不太多,只是在最前面加上const。 **例:**const int num =1

C++指向結構體變數的指標

#include"iostream" #define N 10 using namespace std; //指向結構體變數的指標 struct Student { int numb; char *

c++模擬實現迴圈佇列 三種方法標識、浪費一個空間、計數器

什麼是迴圈佇列? 為充分利用向量空間,克服”假溢位“現象的方法:將向量空間想象為一個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的佇列稱為迴圈佇列(Circular Queue)。 假象成如圖: 但實際上儲存空間還是一段連續的空間。 空佇列: 當有元素入隊時:

C++Vector的陣列用法

1.定義 vector<vector<int>>a; 2.初始化 a.resize(row,vector<int>(column)); a.resize(row);for (int i = 0; i < row;

C指標陣列作main函式的形參

指標陣列的重要應用是作為main函式的形參,在以往的程式中,main函式的第一行一般形式為: int main()或  int main(void) 括號中為空或為“void”,表示main函式沒有引數,呼叫main函式時不必給出引數。 這是一般程式常採用的格式。實

C++結構指標遍歷結構陣列

#include"iostream.h" #include"stdio.h" struct people { char name[10]; int age; }; people pe[] = {

C++利用指標表示式遍歷陣列

#include"iostream.h" #include"stdio.h" void main() { int array[]={91,95,97,93,96,25,64}; int i,*p =

C++函式如何傳遞二維陣列?二維陣列是怎麼通過指標進行傳遞?

舉例子: int data[3][4] ={ {1,2,3,4} , {5,6,7,8} , {9,10,11,12} }; int total = sum(data,3); 請自己先嚐試寫出sum函式的原型 思考過後,請繼續看下面詳細分析:

C++指標陣列構造字串陣列

</pre><pre name="code" class="html">#include"iostream" using namespace std; //用指標陣列構造字

C++指標陣列的常用方法

#include"iostream.h" #include"stdio.h" void main() { char str[]="大家好,見到諸位很高興。"; char *p; int i; //指

LeetCode80. Remove Duplicates from Sorted Array II 刪除排序陣列中的重複項 II-C++實現及詳細圖解

問題描述: (1)建立一個輔助函式,找出下一個不析相等元素的選表 private: int nextIndex(const vector<int>& nums, int index){ for(int i = index ;

C 經典抽象資料型別ADT之堆疊用靜態陣列實現堆疊

堆疊簡介 堆疊(stack)最鮮明的特點就是後進先出(Last-In First-Out,LIFO)的資料進出方式。 基本的堆疊操作通常被稱為 push 和 pop。push就是將一個新值壓入到堆疊的頂部, pop就是把堆疊頂部的值移出堆疊並返回這個值。堆疊只提供對它的頂

5、C++指標/引用指標和引用的區別

一、指標 int p=12; int *q; int *q=&p;     這裡p為int型別的變數,&p就是p的記憶體地址,*q是一個int型別的變數(是一個值),q為指標是地址,int q=&p;把p的地址賦給了指標q,所以q就

LeetCode154. 尋找旋轉排序陣列中的最小值 II 結題報告 (C++)

原題地址:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/description/ 題目描述: 假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。 ( 例如,陣列 [0,1,2,4,5,

LeetCode153. 尋找旋轉排序陣列中的最小值 結題報告 (C++)

原題地址:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/description/ 題目描述: 假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。 ( 例如,陣列 [0,1,2,4,5,6,7

C#陣列間的取重取餘

string[] arrRate = new string[] { "a", "b", "c", "d" };//A string[] arrTemp = new string[] { "c", "d", "e" };//B string[] arrUpd = arrRate.Inters

C++字元與字元陣列

字元是什麼 共分為4種 字母:a b c ... z 數字:0 1 2 3 ... 9 標點:+ - * / . ; ,等等 控制字元:Tab, Enter等等 用ascii碼來表示以上字元,例如65 <=> 'A',97 <=> 'a',48 <

C++陣列

一維陣列 char arr[5] 型別 陣列名[陣列長度] 陣列可以初始化,也可以不初始化,也可以部分初始化。比如char arr[5] = {90,91};只初始化了前2個元素,char arr[3];沒有初始化,char arr[2] = {45,78};所有都初始化