① c++題目, 假定a是一個二維數組,則a【i】【j】的指針訪問方式為什麼
二維指針是指向鉛叢畝指針的指針...
比槐森方說int a[2][2];
那麼 a就是一個指針,他的值指向a[0],即a[0]的內存地址.
a[0]也是一個指針,所以a是一個指向指針的指針.
a[0]的值指鄭告向a[0][0],即a[0][0]的地址.
如果將數組用指針訪問的話:
a[i][j] = *(*(a+i)+j)
同理,多維數組的訪問:
a[i][j]...[z]=*(*(...*(a+i)+j)...+z)
② 怎樣使用指針引用二維數組的元素
對於a[i][j](二維數組的大小為n×m)而言,
首先要搞清楚行指針和列指針
行指針:&a[i]或者a+i指向行,&a[i]=&*(a+i)=a+i
列指針:a[i]或*(a+i)指向列,a[i]等價於*(a+i)
元素的引用方式有如下三種方式
1.通過地址引用二維元素
*(&a[i][j]),
*(a[i]+j),
*(*(a+i)+j),
*(a[0]+m*i+j)
*(&a[0][0]+m*i+j)
(*(a+i))[j]
2.建立一個指針數組引用二維元素
int *p[3],a[3][2],i,j;
for(i=0;i<3;i++)
p[i]=a[i];//p[i]用來存放地址,a[i]為列地址
等價如下
(1) *(p[i]+j) 與*(a[i]+j)對應
(2)*(*(p+i)+j) 與*(*(a+i)+j)對應
(3)(*(p+i))[j] *(p[i]+j) 與*(a[i]+j)對應
(4)p[i][j] 與a[i][j]對應
3.建立一個行指針引用二維數組元素
int a[3][2],(*p)[2];
p=a;
(1) *(p[i]+j) 與*(a[i]+j)對應
(2)*(*(p+i)+j) 與*(*(a+i)+j)對應
(3)(*(p+i))[j] 與(*(a+i))[j]對應
(4)p[i][j] 與a[i][j]對應
例題如下
1.
#include<stdio.h>
main()
{
int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
int i,j;
printf("輸入學生號:0-2");
scanf("%d",&i);
printf("the score of No.%d are:\n",i);
for(j=0;j<4;j++)
printf("%d\t",*(*(score+i)+j));//score+i為列指針,*(score+i)為行指針
printf("\n");
}
2.
#include<stdio.h>
main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for(p=a[0];p<a[0]+12;p++)//使p依次指向下一個元素,a[i]和*(a+i)是指向列的指針;&a[i]或a+i是指向行的指針
{
if((p-a[0])%4==0)printf("\n");
printf("%4d",*p);//輸出p指向的數組元素的值
}
printf("\n");
}
3
#include<stdio.h>
main()
{
int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
int i,j;
printf("輸入學生號:0-2");
scanf("%d",&i);
printf("the score of No.%d are:\n",i);
for(j=0;j<4;j++)
printf("%d\t",*(score[i]+j));
printf("\n");
}
4
#include<stdio.h>
main()
{
int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
int i,j,*p;
printf("輸入學生號:");
scanf("%d",&i);
printf("the score of No.%d are:\n",i);
for(p=score[i];p<score[i]+4;p++)
printf("%d\t",*p);//p+i指向第i行,*(p+i)指向第i行0列元素*(p+i)+j指向第i行j列元素,是列地址
printf("\n");
}
5.
#include<stdio.h>
main()
{
int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
int i,j,*p;
printf("輸入學生號:");
scanf("%d",&i);
printf("the score of No.%d are:\n",i);
for(p=score[i],j=0;j<4;j++)
printf("%d\t",*(p+j));
printf("\n");
}
6
#include<stdio.h>
main()
{
int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
int i,j,(*p)[4];//指針變數p指向包括4個整型元素的一維數組;
p=score;//p指向二維數組0行元素,p+1所指向的元素是p所指向元素的下一行元素;
printf("輸入學生號:0-2");
scanf("%d",&i);
printf("the score of No.%d are:\n",i);
for(j=0;j<4;j++)
printf("%d\t",*(*(p+i)+j));//p+i指向第i行,p是行指針,*(p+i)指向第i行0列元素,是列指針。*(p+i)+j指向第i行j列元素,是一個元素的地址
printf("\n");
}
③ c++如何用指針指向二維數組
不能用二維指針指向二維數組,指向二維數組的指針最後一維必須是確定的。
int
a[4][4]={1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7};
int
(*s)[4];
//仔掘螞表明s指向一個n*4的數組
s=a;
還有一種方念埋法是將二維數組看成是一維數組(因散肢為數組在內存中連續存儲)
int
a[4][4]={1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7};
int
*s;
s=&a[0][0];
這樣可以用s[x*y]來表示a[x][y];
④ 二維數組如何用指針表示
二維數組用指針表示有兩裂察種方式:
一、動態數組方式。
完全由動態數據構成二維數組。如M行N列的數組,先分配M個一維指針空間,然後在每個一維指針上分配N個元素的空間,即成為動態二維數組。
和普通數組不同,這爛戚種動態二維數組的各行之間地址並不連續。
參考代碼:
#include<stdlib.h>
int**create(intm,intn)//創建m行n列的二維數組。
{
int**r;
inti;
r=(int**)malloc(sizeof(int*)*m);//分配m個int*指針內存。
for(i=0;i<m;i++)//遍歷每行
r[i]=(int*)malloc(sizeof(int)*n);//每行分配n個int型元素。
returnr;//返回地址值。
}
二、通過數組指針指向已有二維數組。
對於已經定義好的M行N列數組,可以使用指向N個飢源陵元素的數組指針,指向該數組並訪問。
參考代碼:
inta[10][5];
int(*p)[5];//每行5個元素的數組指針。
p=a;//把p指向a。
⑤ 用指向數組元素的指針訪問二維數組
int(*p)[10]定義了一個指向二維數組的指針p,賦給它10個長度。然後把a數組的值賦給(*p)[10],注意,這里是a數組是5行10列的,放入(*p)[10]是把a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5],a[0][6],a[0][7],a[0][8],a[0][9]放入(*p)[0]中,同理,將a[1][0...9]放入(*p)[1]。最後(*p)[10]中的值只有五行被初始化為a數組的值了。
在本例中,p和p[0]是同一個改虛意思,就是數組a的起始地址,等價於cout<<腔殲宴a<<endl,但是他們有區別,p指向的是整個數組的首地址,而伍銀p[0]則指向a的首行首地址(繼續往下看...)。
p[9]則值內存為p數組分配的(*p)[9]的地址。如果你仔細驗證程序的輸出結果,你就會發現:
#include
#include "iostream"
using std::cout;
using std::endl;
using std::hex;
void main()
{
int a[5][10]={1,2};
int (*p)[10]=a;
cout<<p<<endl;
cout<<p[0]<<endl;
cout<<p[9]<<endl;
}
輸出結果為(不同機器結果不同):
0012FEB8
0012FEB8
00130020
如果你驗證它們這些地址存儲的值,你會發現:
#include
#include "iostream"
using std::cout;
using std::endl;
using std::hex;
void main()
{
int a[5][10]={1,2};
int (*p)[10]=a;
cout<<*p<<endl;
cout<<(*p)[0]<<endl;
cout<<(*p)[9]<<endl;
}
輸出結果為:
0012FEB8
1
0
這是p和p[0]的區別就體現出來了。因為*p並不是取首元素的值,它這時才相當於p[0]。那如何通過p取得首元素的值呢,很顯然,應該再加一個*操作符,如下:
cout<<**p<<endl;
這時輸出結果自然就會和(*p)[0]一樣是1了。
⑥ c語言如何定義指針指向字元型二維數組
使用指針變數訪問二維數組的任意一個元素的方法:
1.使用列指針:定義一個列指針p,讓它指向二維數組的第0個元素
int a[3][4];
int *p;
p=&a[0][0];
//因為a[0]是第0行的數組名,所以p=&a[0][0]相當於p=a[0],因為a[i][j]前面共有i*4+j個元素
該二維數組的任意i行j列元素可表示為*(行握並p+i*4+j)。
2.使用行指針:定義一個行指針p,讓它指向二維數組的第0行
int a[3][4];
int (*p)[4];
p=a;皮孫 //也可以為p=&a[0];
其中* ( *(p+i)+j)表示任意一個i行j列的元素。
(6)二維數組使用指針訪問擴展閱讀:
數組的使用規則:
1.可以只給部分元素賦初值。當{ }中值的個數少於元素個數時,只給前面部分元素賦值。例如:static int a[10]={0,1,2,3,4};表示只給a[0]~a[4]5個元素賦值,而後5個元素自動賦0值。
2.只能給元素逐個賦值,不能給數組整體賦值。例如給十個元素全部賦1值,只能寫為:static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能寫為:static int a[10]=1;請注意:在C、C#語言中是這樣,但並非在所有涉及數組的地方都這樣,資料庫是從1開始。
3.如不給可初始化的數組賦初值,則全部元素均為0值。
4.如給全部元素賦值,則在數組說明中, 可以不給出數組元素的個數。例如:static int a[5]={1,2,3,4,5};可寫為:static int a[]={1,2,3,4,5};動態賦值可以在程序執行過程中,對數組作動態賦值。這時可用循環檔跡語句配合scanf函數逐個對數組元素賦值。
網路-數組
⑦ 實例分析用指針訪問二維數組的幾種方法
之前對數組的概念一直沒有理解透徹,只覺得數組名就是個常量指針而已,用法和基本的指針差不多。所以當我嘗試用二級指針去訪問二維數組時,就經常會出錯。下面就是剛開始寫的一個錯誤的程序: #include <stdio.h intmain(){intiArray[2][3] = {{1,2,3 },{4,5,6}};int**pArray = NULL; pArray = iArray;printf("array[0][0] = %d\n" , pArray[0][0]);printf("array[1][2] = %d\n" , pArray[1][2]);return0;}開始的時候我是這樣分析的:本來數組和指針就差不多,一維數組和一維指針對應,那麼二維數組名應該和二維指針差不多,所以上面那個程序是沒有錯的,應該列印出的是1和6。但是當我實際編譯運行的時候,卻出現了段錯誤,也就是我訪問了不該訪問的地址空間。那錯誤到底出在什麼地方呢?正確的程序應該怎麼寫呢? 為了解決問題,不得不讓我重新理解數組的含義。仔細翻閱一些書籍後,我發現其實數組並不是我原來想像的那麼簡單:一個常量指針標識的一群變數的集合。數組應該也算是一個完備的變數類型:有名字,有大小,也有地址。只不多就是名字和它的地址一樣罷了。也正是因為數組有大小,所以當用sizeof對數組名進行運算時,算出來的是實際數組的大小,而不是指針的大小。 也正是因為這樣,所以指向數組的指針和指向指針的指針也大不一樣。它們倆最明顯的不同就是表現在指針步進的時候。我們知道指針在進行++運算的時候,跨越的實際地址取決於指針指向的數據類型:對於一般的32位機來說,假如指向的是int型數告如鉛橡團據,跨越的實際地址就是4,指向的是指針型數據,跨越的實際地址也是4,當指向的是數組類型的時候,跨越的實際地址就是數組的長度了。 現在再回頭分析上面那個錯誤程序,根據下標引用符號[]的運算規則,我們知道pArray[0][0]其實就是**pArray,而iArray實際上只是個數組變數名,而它的值就是整個數組的開始地址(其實&iArray,iArray,iArray[0]以及&iArray的值都是數組的開始地址,都是在編譯過程中編譯器賦予的值)。那麼其實*pArray就已經是iArray[0][0]的值了,也就是1,而**pArray則是去訪問地址為1的地址空間中的數據,自然會出段錯誤。 其實用指針訪問二維數組可以直接用一級指針就可以了。比如下面這個程序:intmain(){intiArray[2][3] = {{1,2,3 },{4,5,6}};int*pArray = NULL; pArray = iArray;printf("array[0][0] = %d\n" , *pArray);printf("array[1][2] = %d\n" , *(pArray +1*3+2));return0;}因為數組本身在地址空間中就是連續排列的,根據行數和列數,我們自己計算出訪問單元的地址偏移量就可以用一級指針輕松遍歷二維數組中的所有數據了。 我們還可以嘗試用指向數組的指針來訪問二維數組的成員。下面就是事常式序:intmain(){intiArray[2][3] = {{1,2,3 },{4,5,6}};int(*pArray)[3] = NULL;pArray = iArray;printf("array[0][0] = %d\n" , pArray[0][0]);printf("array[1][2] = %d\n" , pArray[1][2]);return0;}簡單分析一下這個程序:我們知道[]運算符的結合方向是由左向右,pArray[1][2]就等價於(* (pArray + 1))[2],而由於pArray是數組指針,而且數組的長度為3,所以* (pArray + 1)就表示iArray[1]這個數組,則pArray[1][2]則就完全等價於iArray[1][2]。 如果非得想用二級指針來訪問二維數組的話,我們還得借用指針數組(數組內存儲的都是指針類型的襪好數據),下面是事常式序:intmain(){intiArray[2][3] = {{1,2,3 },{4,5,6}};int*ipArray[2] = {iArray[0 ], iArray[1]};int**pArray = NULL; pArray = ipArray;printf("array[0][0] = %d\n" , pArray[1][2]);return0;}由於二級指針要跳兩次,所以中間還需要額外的存儲一級指針的空間。所以一般不建議用二級指針去訪問二維數組。
⑧ 如何在c語言二維數組中使用指針
程序中有些問題:
1、函數的定義有錯誤(參數格式不對);
2、程序中沒有調用函數(或者說是調用格式有誤)
3、函數中的處理邏輯需要修改(一步一步來,這樣容易處理和理解)。
你定義的函數是使用數組作為參數的,數組名本身就是個地址(相當於指針)。
下面在手機上用易歷知食軟體里的微C程序設計來演示修正後的代碼並運行程序,供參考。
手機上修正後的代碼如下圖:
手機上運行的效果如下圖所示:
⑨ 用指向數組元素的指針訪問二維數組
通過
二級指針
去訪問
二維消埋數組
需要先給二級指針分配等同於二維數組行輪橋嘩數的臘行一維
數組指針
,然後把二維數組的每行首地址賦值給對應位置的一維指針上。之後就可以通過二維指針直接訪問了。