二維陣列指標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