雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網!

C語言

當前位置:主頁 > 軟件編程 > C語言 >

C語言中二維數組指針的簡要說明

來源:本站原創(chuàng)|時間:2020-01-10|欄目: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語言中的開方實現(xiàn)

欄    目:C語言

下一篇:詳解約瑟夫環(huán)問題及其相關的C語言算法實現(xiàn)

本文標題:C語言中二維數組指針的簡要說明

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2903.html

網頁制作CMS教程網絡編程軟件編程腳本語言數據庫服務器

如果侵犯了您的權利,請與我們聯(lián)系,我們將在24小時內進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網 版權所有