日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++如何打印一维数组首地址_C语言之二维数组和指针的结合

發布時間:2024/4/19 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++如何打印一维数组首地址_C语言之二维数组和指针的结合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在練習 C 語言計算機二級的程序設計題,碰到了二維數組和指針的結合,當時怎么調試都不對,自己也記不清楚該怎么用了就跑去看書翻資料重新復習。自己糾結的問題是二維數組 int a[3][4]的數組名是二級指針嗎?答案不是,而在的復習講解上說是地址的地址是錯的(但是他的講解確實很讓人懂二維數組的使用),a 退化為指針后,類型為 int (*)[4], 該指針指向含 4 個 int 類型元素的一維數組。(例:一維數組 b [4],b 則退化為元素指針)既然 a 都不是指針的指針,則想通過 int **p=a 對 p 進行賦值就是不可實現的。
那么如何實現通過指針p來對a[3][4]來進行操作?
在看如何賦值之前有必要了解一下
這幾個 &a,a,a[0],&a[0],&a[0][0] 地址 (因 a[0][0] 為元素值,不在討論范圍內) 的不同之處。
#include<stdio.h>
void main()
{
int a[3][4]={20,30,40,50,60,70,80,90,100,110,120,130},i,j;
printf("&a=%dn",&a);
printf("&a+1=%dn",&a+1);
printf("a=%dn",a);
printf("a+1=%dn",a+1);
printf("&a[0]=%dn",&a[0]);
printf("&a[0]+1%dn",&a[0]+1);
printf("a[0]=%dn",a[0]);
printf("a[0]+1=%dn",a[0]+1);
printf("&a[0][0]=%dn",&a[0][0]);
printf("&a[0][0]+1=%dn",&a[0][0]+1);
}
運行結果(該結果為本人電腦運行看,可能有所不同):
&a=5241364
&a+1=5241412
a=5241364
a+1=5241380
&a[0]=5241364
&a[0]+15241380
a[0]=5241364
a[0]+1=5241368
&a[0][0]=5241364
&a[0][0]+1=5241368
通過觀察可以看出 &a,a,a[0],&a[0],&a[0][0] 的結果都是 5241364,證明他們的地址是相同的。
但是都進行 + 1 操作后就知道不同了。
&a+1 和 & a 差值為 48,正好是二維數組的長度(4(int 長度)X3X4=48),+1 是加了一個二維數組長度。
a+1 和 a 的差值為 16,是 a [][4] 的長度,進行 + 1 則從 a 退化為 a [0] 的地址進行加值之后變為 a [1] 的地址,可以證明 a 加 1 是從 a [0] 到 a [1] 的變化。
&a [0]+1 和 & a [0] 的差值為 16,&a [0] 表示一行 (一個一維數組) 的首地址,進行 + 1 后是下一組的首地址& a [1]。a [0]+1 和 a [0] 的差值為 4,a [0] 表示這一行的首元素的地址,+1 則是從 a [0] 開始退化為 a [0][0] 的指針之后進行加值則變為 a [0][1] 的地址;&a [0][0]+1 和 & a [0][0] 的差值為 4,&a [0][0] 表示這一行(一維數組)的首元素的值的地址,當 + 1 則變為 a [0][1] 的地址。
如果還是不了解看下圖(搜集于網絡圖片)

分析圖
由上面了解之后再看下面就方便理解了。
第一種方式:通過將定義 p 為:int (*p)[4] 形式,和上面 a 所退化為指針后的類型相同,因此則可以直接將 a 賦值給 p;代碼如下:
#include<stdio.h>
void main()
{
int a[3][4]={20,30,40,50,60,70,80,90,100,110,120,130},i,j;
int (*p1)[4]=a;
for(i=0;i<3;i++)//數組形式(方便理解)
{
for(j=0;j<4;j++)
printf("%3d ",p1[i][j]);
printf("n");
}
printf("n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)//指針形式
printf("%3d ",*(*(p1+i)+j));
printf("n");
}
}
第二種方式:在內存中,并不存在多維數組,因為內存是一維的,內存里面不分行也不分列,元素都是按順序一個一個往后排的,所以二維數組中的每一個元素在內存中的地址都是連續的。(摘自講解中的話),因此我們只要找到令指針指向二維數組的首地址就能通過順序來找到接下的元素。因為二維數組 a 的地址和 a [0] 是一樣的,我們讓 int *p=a[0],則可以找到首地址,調用過程中需要通過 *(p1+4*i+j) 來找接下來的元素。
#include<stdio.h>
void main()
{
int aa[3][4]={20,30,40,50,60,70,80,90,100,110,120,130},i,j;
int *p1=a[0];//[0]是地址
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)//
printf("%3d ",*(p1+4*i+j));
printf("n");
}
}
到此分析完畢。

總結

以上是生活随笔為你收集整理的c++如何打印一维数组首地址_C语言之二维数组和指针的结合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。