<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
指標的本質是變數
指標會佔用一定的記憶體空間
可以定義指標的指標來儲存指標變數的地址值
為什麼需要指向指標的指標?
下面看一個重置動態空間大小(從 size 到 new_size)的程式碼:
#include <stdio.h> #include <malloc.h> int reset(char** p, int size, int new_size) { int ret = 1; int i = 0; int len = 0; char* pt = NULL; char* tmp = NULL; char* pp = *p; if ((p != NULL) && (new_size > 0)) { pt = (char*)malloc(new_size); tmp = pt; len = (size < new_size) ? size : new_size; for(i = 0; i < len; i++) { *tmp++ = *pp++; } free(*p); *p = pt; } else { ret = 0; } return ret; } int main() { char* p = (char*)malloc(5); printf("%pn", p); if(reset(&p, 5, 3)) { printf("%pn", p); } free(p); return 0; }
輸出結果如下:
簡單來說邏輯是這樣:新申請記憶體空間,然後複製原來記憶體空間裡面的值到新的記憶體空間,然後釋放之前的記憶體空間。
如下:
下面看一個遍歷二維陣列的範例:
#include <stdio.h> #include <malloc.h> void printArray(int a[], int size) { int i = 0; printf("printArray: %dn", sizeof(a)); for(i = 0; i < size; i++) { printf("%dn", a[i]); } } int main() { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int* p = &a[0][0]; int i = 0; int j = 0; for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { printf("%d, ", *(*(a+i) + j)); } printf("n"); } printf("n"); printArray(p, 9); return 0; }
輸出結果如下:
*(*(a + i) + j) 的問題:
假設int a[2][3]={{1,2,3},{4,5,6}}, b=*(*(a + 1) + 1);
a 是二維陣列,表示二維陣列 a 的地址,a[0]、a[1]可看作是 2 個一維陣列,分別是一維陣列 a[0]、a[1] 的地址,a[0] 的值為{1,2,3},a[1] 的值為{4,5,6}。a、a[0]、*a 都是 a[0] 的地址,a + 1、a[1]、*(a + 1)都是 a[1] 的地址。
看下面的例子就明白了:
#include <stdio.h> int main(void) { int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; printf("%p %p %p %pn", &a[0][0], a, a[0], *a); printf("%p %p %p %p %pn", &a[0][0] + 1, a + 1, a[1], *(a + 1), &a[1][0]); printf("%p %p %p %pn", (a + 1) + 1, a + 1 + 1, &a[1][1], &a[2][0]); printf("%d %dn", *(*(a + 1) + 1), a[1][1]); return 0; } /* &a[0][0], a, a[0], *a 這四個地址值相同,都是指 a[0][0] 的地址 a + 1, a[1], *(a + 1) 這三個地址值相同,都是指 a[1][0] 的地址 &a[0][0] + 1 的值與 a + 1 的值不相同,前者表示的是 a[0][1]的地址,後者表示的是 a[1][0] 的地址 a + 1, a[1], *(a + 1) 的值一樣,都是代表 a[1][0] 的地址 a[1] + 1, *(a + 1) + 1 代表 a[1][1] 的地址 a + 1 + 1 代表的是 a[2][0] 的地址 可以這麼理解: a[1] 和 *(a + 1) 地址相同(二維陣列中,a[1]裡面存放的值和 a[1] 的地址相同,這與一維陣列不同) 當對 a[1] 和 *(a + 1) 進行操作時,如 a[1] + 1 或者 *(a + 1) + 1,相當於固定第二行,開始進行列的偏移操作 但是單獨對 a 進行操作時,如 a + 1 + 1,這就是行數固定到第三行,取的地址就是 a[2][0] */
輸出結果如下:
結論:
下面看一個動態申請二維陣列的範例:
#include <stdio.h> #include <malloc.h> int** malloc2d(int row, int col) { int** ret = NULL; if( (row > 0) && (col > 0) ) { int* p = NULL; ret = (int**)malloc(row * sizeof(int*)); p = (int*)malloc(row * col * sizeof(int)); if( (ret != NULL) && (p != NULL) ) { int i = 0; for(i = 0; i < row; i++) { ret[i] = p + i * col; } } else { free(ret); free(p); ret = NULL; } } return ret; } void free2d(int** p) { if( *p != NULL ) { free(*p); } free(p); } int main() { int** a = malloc2d(3, 3); int i = 0; int j = 0; for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { printf("%d, ", a[i][j]); } printf("n"); } free2d(a); return 0; }
輸出結果如下:
到此這篇關於C語言詳細講解多維陣列與多維指標的文章就介紹到這了,更多相關C語言 多維陣列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45