国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C > 正文

C語(yǔ)言中二維數(shù)組指針的簡(jiǎn)要說(shuō)明

2020-01-26 14:59:12
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

C語(yǔ)言中,指針是一個(gè)復(fù)雜但又靈活多變的知識(shí)點(diǎn),我們知道,在一維數(shù)組中,對(duì)于一個(gè)數(shù)組a[],*a,a,&a,都表示a的首地址,但如果與二維數(shù)組混合使用,就顯得更為復(fù)雜了。例如對(duì)于一個(gè)二維數(shù)組

 a[2][4]={{1,2.3},{4,5,6}} a+i,&a[i],*(a+i),a[i],

這四個(gè)表達(dá)式到底表示什么呢?

先告訴答案吧,其實(shí)這幾個(gè)表達(dá)式都是指向同一個(gè)地址的,也許你會(huì)很詫異,也會(huì)很疑惑,怎么會(huì)是這樣呢!!事實(shí)證明就是這樣的,

2015810163408432.jpg (205×93)

C語(yǔ)言中,指針是一個(gè)復(fù)雜但又靈活多變的知識(shí)點(diǎn),我們知道,在一維數(shù)組中,對(duì)于一個(gè)數(shù)組a[],*a,a,&a,都表示a的首地址,但如果與二維數(shù)組混合使用,就顯得更為復(fù)雜了。例如對(duì)于一個(gè)二維數(shù)組

 a[2][4]={{1,2.3},{4,5,6}} a+i,&a[i],*(a+i),a[i],

這四個(gè)表達(dá)式到底表示什么呢?

先告訴答案吧,其實(shí)這幾個(gè)表達(dá)式都是指向同一個(gè)地址的,也許你會(huì)很詫異,也會(huì)很疑惑,怎么會(huì)是這樣呢!!事實(shí)證明就是這樣的。

來(lái)看一道題目:

char **p,a[6][8]; 問(wèn)p=a是否會(huì)導(dǎo)致程序在以后出現(xiàn)問(wèn)題?為什么?

直接用程序說(shuō)明:

#include<stdio.h>void main(){  char **p,a[6][8];  p = a;  printf("/n");}

編譯,然后就會(huì)發(fā)現(xiàn)通不過(guò),報(bào)錯(cuò):錯(cuò)誤 1 error C2440: “=”: 無(wú)法從“char [6][8]”轉(zhuǎn)換為“char **”

于是乎,我看了下《C專家編程》里10.5節(jié)―使用指針向函數(shù)傳遞一個(gè)多維數(shù)組。

方法一,函數(shù)是 void fun(int arr[2][3]); 這種方法只能處理2行3列的int型數(shù)組。

方法二,可以省略第一維的長(zhǎng)度。函數(shù)是 void fun(int arr[][3]);這種方式雖然限制寬松了一些,但是還是只能處理每行是3個(gè)整數(shù)長(zhǎng)度的數(shù)組。

    或者寫(xiě)成這種形式 void fun(int (*arr)[3]);這是一個(gè)數(shù)組指針或者叫行指針,arr和*先結(jié)合使得arr成為一個(gè)指針,這個(gè)指針指向具有3個(gè)

    int類型數(shù)據(jù)的數(shù)組。

方法三,創(chuàng)建一個(gè)一維數(shù)組,數(shù)組中的元素是指向其他東西的指針,也即二級(jí)指針。函數(shù)是 int fun(int **arr);這種方法可以動(dòng)態(tài)處理各行各列不一樣長(zhǎng)度的數(shù)據(jù)。

注意:只有把二維數(shù)組改成一個(gè)指向向量的指針數(shù)組的前提下才可以這么做!比如下面的程序可以正常輸出abc:

#include <iostream> using namespace std; void test(char **ptr) {   cout << *ptr << endl; }  int main() {   char *p[3] = {"abc", "def", "ghi"};   test(p);   return 0; }

在《C專家編程》10.3節(jié)的小啟發(fā)里講的很透徹:(以下這段文字及對(duì)比一定要認(rèn)真分析!)

數(shù)組和指針參數(shù)是如何被編譯器修改的?

“數(shù)組名被改寫(xiě)成一個(gè)指針參數(shù)”規(guī)則并不是遞歸定義的。數(shù)組的數(shù)組會(huì)被改寫(xiě)成“數(shù)組的指針”,而不是“指針的指針”:

2015810163503937.jpg (543×184)

下面再看一個(gè)網(wǎng)友的一段分析相當(dāng)給力的代碼:

#include "stdafx.h" #include <iostream> using namespace std;  int _tmain(int argc, _TCHAR* argv[]) {   int arr1[3];   int arr2[3];   int arr3[3];   int * ptr;   // ptr1是一個(gè)指向 int [3] 的指針,即ptr的類型和&arr1的類型是一樣的,注意:arr1指向的內(nèi)存區(qū)域定長(zhǎng)   int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}};   // ptr2是一個(gè)指向 int * 的指針,即ptr2的類型和&ptr是一樣的,注意:ptr指向的內(nèi)存區(qū)域不定長(zhǎng)   int * ptr2[3]={arr1,arr2,arr3};   // ptr3是一個(gè)指向 int [3] 的指針,即ptr3的類型和&arr1的類型是一樣的,注意:arr1指向的內(nèi)存區(qū)域定長(zhǎng)   int(* ptr3)[3]=&arr1;   ptr3=ptr1; // 沒(méi)錯(cuò),他們的類型相同  // ptr3=ptr2;//error 無(wú)法從“int *[3]”轉(zhuǎn)換為“int (*)[3]  // ptr4是一個(gè)指向 int * 的指針,即ptr4的類型和&ptr是一樣的,注意:ptr指向的內(nèi)存區(qū)域不定長(zhǎng)   int ** ptr4;   //ptr4=&arr1; //error 無(wú)法從“int (*)[3]”轉(zhuǎn)換為“int **   ptr4=ptr2; // 沒(méi)錯(cuò),他們的類型相同  //ptr4=ptr3; // error 無(wú)法從“int (*)[3]”轉(zhuǎn)換為“int **   return 0; }


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 安仁县| 清新县| 玉门市| 南澳县| 昆明市| 哈尔滨市| 长武县| 阿荣旗| 通江县| 塘沽区| 北安市| 油尖旺区| 和顺县| 运城市| 奉节县| 当涂县| 海阳市| 武乡县| 合江县| 灵武市| 太仓市| 抚远县| 沈丘县| 绥江县| 萨嘎县| 蓬溪县| 前郭尔| 铁力市| 崇阳县| 南漳县| 金门县| 明水县| 视频| 和田市| 乐业县| 和林格尔县| 屯留县| 清水河县| 梁山县| 班戈县| 宣威市|