關於二維陣列的指標理解
#include <stdio.h>
int main()
{
int s[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int (*ps)[3][3] ={&s};
printf("value:%x\n",ps[0][0]); /*0x22fe20存著s的地址*/
printf("value:%d\n",*ps[0][0]); /*1 首元素的內容*/
printf("value:%d\n",s[0][0]); /*1 首元素的內容*/
printf("addr:%p\n",s); /*0x22fe20 s的地址*/
}
printf("value:%x\n",ps[0][1]); /*0x22fe2c,即首地址+12*/
printf("value:%d\n",*ps[0][1]); /*4*/
printf("value:%x\n",ps[1][0]); /*0x22fe44,即首地址+36*/
printf("value:%d\n",*ps[1][0]); /*0*/
int (*ps)[3][3]
定義的是一個指標,指標指向一個3*3的陣列,實際上,只能通過它讀取到s[1],s[2]和s[3],即第1、2、3行內容的首元素。
這是由於s[3][3]本身就是等同於一個s[3],而這三個陣列元素中存的內容是int *,也就是各行的首地址。
也就是說,int(*x)[]這種格式,對於二維陣列來說,並不適用,只能取到每行的無法直接呼叫x[][]。
而實際上,若定義int (*ps)[3][3]
int *(*ps)[3]
,也就是退化成一個指標,該指標是一個指向指標陣列(包含3個元素)的指標。同理, int *ps[3][3]
型別當做形參,也是一樣。但由於int *ps[3][3]
是3*3的指標陣列,在賦值時,如果直接讓它等於{&s},只能給ps[0][0]賦值,其他均是初值,只能直接讀到整個陣列的第一個元素。
若到在C中直接使用二維陣列的指標傳參,最多隻能直接得到各行的首地址,其後的元素地址,需要通過指標操作來獲得。
若需要把二維陣列傳入函式,最簡便的方法,是直接傳陣列本身即可。
此時對於函式來說,傳入的二維陣列的型別為int (*)[3]
#include <stdio.h>
void test(int tmp[3][3])
{
printf("%x\t",tmp); /*22fe20*/
printf("%d\t",(tmp[1][2]));/*6*/
(tmp[1][2]) = 2;
printf("%d\t",(tmp[1][2]));/*2*/
}
int main()
{
int s[3][3]={{1,2,3},{4,5,6},{7,8,9}};
printf("%x\t",s);/*22fe20*/
test(s);
printf("%d\t",(s[1][2]));/*2*/
}
結論:在函式中傳入陣列,等同於傳入指標,對形參的改變,會同時改變實參
相關推薦
對二維陣列指標的理解
假如有二維陣列arr[][]. arr表示陣列第一行第一個元素的地址,也可用來表示第一行的總體地址。同理的也有arr[0]。 arr+1表示二維陣列第二行第一個元素的地址,也可以用來表示第二行的總體地址。同理的也有arr[1]。 *arr 也表示二維陣列第一行第一個的首
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
一維陣列、二維陣列的理解
陣列名字與指標關係的理解: 陣列名字實際上指向的是陣列中的“元素”的地址,而不是一個元素的地址。 例如: 一維陣列,二維陣列,甚至n維陣列在記憶體中的“元素”儲存都是連續的一個接著一個。 一維陣列: int a[3]={1,2,3} // a陣列中有三個元素,而
C語言陣列篇(五)多級指標和二維陣列指標的區別
多級指標 以二級指標為例 二級指標的由來是 指標陣列 的指標形式. int *p[10] 讀取的順序是 p[10] --> 10個空間的陣列 * p[10] --> 這10個空間的數組裡面存放的資
關於二維陣列指標的問題
#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
二維陣列指標p+1與*(p+1)
先說說a和&a的區別(有三點,三個方向): 1.是a和&a的本質,都是什麼型別的。 2.從2維陣列的角度看。 3.從指標運算的角度看。 宣告:雖然陣列名不是指標,但是用的很像指標,我們暫且把它叫做一個指標吧。 第一個問題:int a[10]; a
C/C++建立二維陣列/指標陣列
三個方法: 1.用兩層vector模版直接做。2.用一維陣列模擬二維,即int * p = new int [x * y];分配一個x * y大的陣列,然後要用的時候把二維下標對映到一維中,這樣做的最大好處是,分配的陣列空間是連續的,像一個真正的二維陣列,缺點是用起來不像二
二維陣列指標的使用
# 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
C 語言中二維陣列指標詳解
C語言中,指標是一個複雜但又靈活多變的知識點,我們知道,在一維陣列中,對於一個數組a[],*a,a,&a,都表示a的首地址,但如果與二維陣列混合使用,就顯得更為複雜了。例如對於一個二維陣列 a[2][4]={{1,2.3},{4,5,6}} a+i,&a
C/C++函式返回二維陣列指標問題
方法1:需要對指標有較好的理解int(*f())[2]{int (*m)[2]=new int[2][2];m[0][0]=1;m[0][1]=0;m[1][0]=2;m[1][1]=0;return m;}//總感覺這種函式定義很怪,可以使用typedef重定義下型別,如
關於二維陣列的指標理解
#include <stdio.h> int main() { int s[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int (*ps)[3][3] ={&s}; pri
二維陣列模型之指標陣列
#include <stdio.h> #include <stdlib.h> #include <string.h> #if 0 int main(int agrc, char *argv[]) { int i = 0; for(; i<
c語言實現用指標遍歷二維陣列
1 #include <stdio.h> 2 void bian(int row,int col,int *a) 3 { 4 int i,j; 5 for(i=0;i<row;i++) 6 for(j=0;j<col;j++) 7
【C語言】一維陣列、二維陣列與指標
一維陣列和指標: 1、一維陣列名: 對於這樣的一維陣列:int a[4]; a作為陣列名就是我們陣列的首地址, a是一個地址常量 . 首先說說常量和變數的關係, 對於變數來說, 用箱子去比喻再好不過了, 宣告一個變數就宣告一個箱子,比如我們開闢出一個蘋果型別的箱子, 給這個變
二維陣列、指標詳解
二維陣列、指標詳解: 1.研究二維陣列的表示。 首先,用程式碼執行進行測試,驗證的相關結果, // C.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> using namespace std
利用動態規劃演算法解01揹包問題->二維陣列傳參->cpp記憶體管理->堆和棧的區別->常見的記憶體錯誤及其對策->指標和陣列的區別->32位系統是4G
1、利用動態規劃演算法解01揹包問題 https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 兩層for迴圈,依次考察當前石塊是否能放入揹包。如果能,則考察放入該石塊是否會得到當前揹包尺寸的最優解。 // 01 knap
C/C++二維陣列名和二級指標
轉載自http://blog.csdn.net/wu_nan_nan/article/details/51741030 C/C++二維陣列名和二級指標 原創 2016年06月23日
對二維陣列使用指標進行操作的探索(C語言)
1 /* 2 Name: 對二維陣列使用指標進行操作的探索 3 Copyright: 4 Author: lingr7 5 Date: 01/12/18 11:55 6 Description: 7 */ 8 #include<stdi
C語言之指標與二維陣列
指標,其實就是地址,可以指向一塊自己分配大小的空間。陣列即是多塊一位的空間的線性排布。二維陣列,雖然在人文定義的感覺上有了面的理解,但實際在記憶體中也是一維的線性空間。 對於討論二維陣列,首先我們應該先討論一維陣列與