C語言中二維數組指針的簡要說明
C語言中,指針是一個復雜但又靈活多變的知識點,我們知道,在一維數組中,對于一個數組a[],*a,a,&a,都表示a的首地址,但如果與二維數組混合使用,就顯得更為復雜了。例如對于一個二維數組
a[2][4]={{1,2.3},{4,5,6}}
a+i,&a[i],*(a+i),a[i],
這四個表達式到底表示什么呢?
先告訴答案吧,其實這幾個表達式都是指向同一個地址的,也許你會很詫異,也會很疑惑,怎么會是這樣呢!!事實證明就是這樣的,
C語言中,指針是一個復雜但又靈活多變的知識點,我們知道,在一維數組中,對于一個數組a[],*a,a,&a,都表示a的首地址,但如果與二維數組混合使用,就顯得更為復雜了。例如對于一個二維數組
a[2][4]={{1,2.3},{4,5,6}}
a+i,&a[i],*(a+i),a[i],
這四個表達式到底表示什么呢?
先告訴答案吧,其實這幾個表達式都是指向同一個地址的,也許你會很詫異,也會很疑惑,怎么會是這樣呢??!事實證明就是這樣的。
來看一道題目:
char **p,a[6][8]; 問p=a是否會導致程序在以后出現(xiàn)問題?為什么?
直接用程序說明:
#include<stdio.h>
void main()
{
char **p,a[6][8];
p = a;
printf("\n");
}
編譯,然后就會發(fā)現(xiàn)通不過,報錯:錯誤 1 error C2440: “=”: 無法從“char [6][8]”轉換為“char **”
于是乎,我看了下《C專家編程》里10.5節(jié)—使用指針向函數傳遞一個多維數組。
方法一,函數是 void fun(int arr[2][3]); 這種方法只能處理2行3列的int型數組。
方法二,可以省略第一維的長度。函數是 void fun(int arr[][3]);這種方式雖然限制寬松了一些,但是還是只能處理每行是3個整數長度的數組。
或者寫成這種形式 void fun(int (*arr)[3]);這是一個數組指針或者叫行指針,arr和*先結合使得arr成為一個指針,這個指針指向具有3個
int類型數據的數組。
方法三,創(chuàng)建一個一維數組,數組中的元素是指向其他東西的指針,也即二級指針。函數是 int fun(int **arr);這種方法可以動態(tài)處理各行各列不一樣長度的數據。
注意:只有把二維數組改成一個指向向量的指針數組的前提下才可以這么做!比如下面的程序可以正常輸出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ā)里講的很透徹:(以下這段文字及對比一定要認真分析?。?/p>
數組和指針參數是如何被編譯器修改的?
“數組名被改寫成一個指針參數”規(guī)則并不是遞歸定義的。數組的數組會被改寫成“數組的指針”,而不是“指針的指針”:
下面再看一個網友的一段分析相當給力的代碼:
#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是一個指向 int [3] 的指針,即ptr的類型和&arr1的類型是一樣的,注意:arr1指向的內存區(qū)域定長
int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}};
// ptr2是一個指向 int * 的指針,即ptr2的類型和&ptr是一樣的,注意:ptr指向的內存區(qū)域不定長
int * ptr2[3]={arr1,arr2,arr3};
// ptr3是一個指向 int [3] 的指針,即ptr3的類型和&arr1的類型是一樣的,注意:arr1指向的內存區(qū)域定長
int(* ptr3)[3]=&arr1;
ptr3=ptr1; // 沒錯,他們的類型相同
// ptr3=ptr2;//error 無法從“int *[3]”轉換為“int (*)[3]
// ptr4是一個指向 int * 的指針,即ptr4的類型和&ptr是一樣的,注意:ptr指向的內存區(qū)域不定長
int ** ptr4;
//ptr4=&arr1; //error 無法從“int (*)[3]”轉換為“int **
ptr4=ptr2; // 沒錯,他們的類型相同
//ptr4=ptr3; // error 無法從“int (*)[3]”轉換為“int **
return 0;
}
欄 目:C語言
下一篇:詳解約瑟夫環(huán)問題及其相關的C語言算法實現(xiàn)
本文標題:C語言中二維數組指針的簡要說明
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2903.html
您可能感興趣的文章
- 04-02c語言函數調用后清空內存 c語言調用函數刪除字符
- 04-02c語言的正則匹配函數 c語言正則表達式函數庫
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言中對數函數的表達式 c語言中對數怎么表達
- 04-02c語言用函數寫分段 用c語言表示分段函數
- 04-02c語言編寫函數冒泡排序 c語言冒泡排序法函數
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段函數
- 04-02C語言中怎么打出三角函數 c語言中怎么打出三角函數的值
- 04-02c語言調用函數求fibo C語言調用函數求階乘


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言的正則匹配函數 c語言正則表達
- 04-02c語言用函數寫分段 用c語言表示分段
- 04-02c語言中對數函數的表達式 c語言中對
- 04-02c語言編寫函數冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數 c語言中怎
- 04-02c語言調用函數求fibo C語言調用函數求
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子


