1. 程式人生 > >二維陣列指標p+1與*(p+1)

二維陣列指標p+1與*(p+1)

先說說a和&a的區別(有三點,三個方向):

1.是a和&a的本質,都是什麼型別的。
2.從2維陣列的角度看。
3.從指標運算的角度看。

宣告:雖然陣列名不是指標,但是用的很像指標,我們暫且把它叫做一個指標吧。

第一個問題:
int a[10];  a ,&a和&a[0] 都是分別是什麼?先說明a ,&a和&a[0]三個值是的相等哈。

a叫做陣列名,是陣列首元素的地址,也就是&a[0]的值。像是一個指標型別,是一個int型的指標型別,int *,先理解成指標吧。

&a這才是一個真正的指標,是一個數組指標。是陣列的地址。

切記:&a不是指向指標的指標,因為&a和a的值相等,但是*&a和*a的值不相等。*&a和a的值一樣,說明*&a僅僅是對這個陣列指標進行了取值,取得的是陣列的值,即陣列首元素的地址,而不是對&a這個地址進行了取值。這個應該是c語言中針對陣列指標運算的規定。 

這裡的陣列指標&a取值之後,變成了a,是a,不是*a,變成了這個陣列的陣列名,或者說是陣列首元素的地址。

我做了如下實驗:

複製程式碼程式碼如下:
#include<stdio.h>
 int main()
 {
         int a[5]={1,2,3,4,5};
         printf("a=%x\n",a);
         printf("&a=%x\n",&a);
         printf("*(int*)&a=%x\n",(*((int *)(&a))));
         printf("*&a=%x\n",(*(*(&a))));
         printf("&a[0]=%x\n",&a[0]);
         printf("*&a[0]=%x\n",*(&a[0]));
         return 0;
 }


複製程式碼
程式碼如下:
printf("*(int*)&a=%x\n",(*((int *)(&a))));

這句沒有像常規的一樣對&a進行取值,而是強制型別轉換了一下,可見這個不是一個指向指標的指標。 

第二個問題:
二維陣列中的利用指標來遍歷的方式,也不是一個指向指標的指標(2級指標) ,這句printf("%d\n", *(*(a+i) + j));  *(a+i)也就是將陣列指標取值獲得陣列的首元素地址,常常的誤區就是陣列指標的取值運算和普通的指標取值運算不一樣。陣列指標取值運算類似一個強制型別轉換的過程。    

注意:二維陣列的陣列名a,是第一個一維陣列的陣列指標,*a就是第一個一維陣列的陣列名。也可以直接用tpye *強制型別轉換。

複製程式碼程式碼如下:
 #include <stdio.h>

 int main(int argc, char* argv[], char* env[])
 {
    int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
    int i = 0;
    int j = 0;

    for(i=0; i<3; i++)
    {
         for(j=0; j<3; j++)
         {
           //  printf("%d\n", *((int *)(a+i) + j));
                  printf("%d\n", *(*(a+i) + j));
         }
     }

其實這兩個東西挺難理解的,應該也沒有那麼重要,瞭解一下好了,主要還是要多多理解陣列指標的運算。因為我看了好多文章都是通過對&a和a的運算角度來說明兩者不是一個東西的。

相關推薦

java陣列的長度是否固定面試題

java中二維陣列的長度是否固定 其實在java中二維陣列是先建立一個一維陣列,然後該陣列的元素在引用另外一個一維陣列,在使用二維陣列的時候,通過兩個“[]”來訪問每一層維度的引用,直到訪問到最終的資料,為此我做了如下程式碼測試:` public class DemArry{ pu

Java陣列的遍歷方法兩種

class printArray { public static void main(String[] args) { int[][] arr = {{1,2,3},{4,5},

java實現陣列排序並定位座標藉助list

import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Comparator; public  class test {static

陣列指標p+1*p+1

先說說a和&a的區別(有三點,三個方向): 1.是a和&a的本質,都是什麼型別的。 2.從2維陣列的角度看。 3.從指標運算的角度看。 宣告:雖然陣列名不是指標,但是用的很像指標,我們暫且把它叫做一個指標吧。 第一個問題:int a[10];  a

C語言陣列多級指標陣列指標的區別

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

陣列的初始化遍歷

       這裡主要寫一些二維陣列的簡單總結,我對二維陣列的理解是:“數組裡面套陣列”;對比一下一維陣列,一維陣列中的元素是基本型別的數值或者是引用,那麼二維陣列的元素即為一維陣列,也就是陣列中套陣列。   &nbs

C語言陣列指標練習

描述 程式填空,使其輸出結果是: 1,2,3,4, 10,12,14,16, 18,20,11,12, #include <iostream> using namespace std; void Double(int * p, int n) { for(int i = 0;i

資料結構演算法題/最大子矩陣陣列中和最大的連續子矩陣

給定一個矩陣,都是整數,求出其中的最大子矩陣。 可以將問題轉換為求一維陣列的最大子序列和的問題。具體見https://blog.csdn.net/fkyyly/article/details/83088247 /** * 其實思想是控制新的子矩陣開始,按列相加變成一維陣列,然後再求一維陣列

關於C++的陣列的一個問題解決

最近在做一個專案,過程中new了一個二維陣列來儲存中間變數。因為這些變數用完後就沒有用了再加上陣列規模有點大,就想把它刪除釋放空間。 double(*p1)[3 * length] = new double[number][3 * length]; 然而在刪除陣列過

TP5:陣列遍歷用save方法 ,報主鍵ID重複解決方法

$mUser = model('User'); foreach ($arrData as $k => $v) { $arrData[$k]['addtime'] = time(); $res = $mUser->isUpdate(false)->data($arr

openjudge 陣列右上坐下遍歷陣列

二維陣列右上左下遍歷 檢視提交統計提問 總時間限制: 1000ms 記憶體限制: 65536kB 描述 給定一個row行col列的整數陣列array,要求從array[0][0]元素開始

陣列右上左下遍歷C程式設計進階第5周

問題描述 給定一個row行col列的整數陣列array,要求從array[0][0]元素開始,按從左上到右下的對角線順序遍歷整個陣列。 輸入 輸入的第一行上有兩個整數,依次為row和col。 餘

C++程式設計筆記:陣列的動態分配釋放

當給定的條件不同時,二維陣列的動態分配方式不同。例如,已知二維陣列的行數(即第一維維度)為多少的情況下對其進行動態分配,與知道列數(第二維維度),或者兩個維度都未知的情況下,二維陣列的動態分配方式都不同,對應的釋放方式也不同。下面我們就來一一介紹。 1.

關於陣列指標的問題

#include <stdio.h> int main() { int a[3][4] = {11,23,65,85,89,98,97,68,88,66,97,100}; int *p

c++陣列指標

1.定義指標指向二維陣列 為了方便根據使用者輸入動態定義二維陣列的行和列,引入變數rowsNum(行),colsNum(列)。 以定義5行4列的二維陣列為例, int rowsNum = 4; int colsNum = 5; float** a = new flo

C/C++建立陣列/指標陣列

三個方法: 1.用兩層vector模版直接做。2.用一維陣列模擬二維,即int * p = new int [x * y];分配一個x * y大的陣列,然後要用的時候把二維下標對映到一維中,這樣做的最大好處是,分配的陣列空間是連續的,像一個真正的二維陣列,缺點是用起來不像二

陣列作為函式引數傳遞C++

有時候我們也許會不明白為什麼C++中的陣列宣告的時候下標是需要一個常數,而不能是一個變數吶?也許STL模板庫中的向量可以解決變數作為下標的陣列宣告方式,為了節約一些記憶體或者是提高一些效能,也為了功能不重複,故而陣列中的下標採取了常量的方式。 int a[

PHP陣列去重的方法保留各個鍵值的同時去除重複的項-- 陣列的唯一性

對於如下二維陣列,要求對其進行去重: $arr = array( '0'=>array( 'name'=>'james', 'age'=>30,

陣列解決方案--vector迭代器

#include "stdafx.h" #include #include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector&g

陣列指標的使用

# include <stdio.h> int main(void) { int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}}; printf("%0x\n", a