欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言中二維數(shù)組指針的簡要說明

 更新時間:2015年08月10日 16:44:12   作者:Echo Jin  
這篇文章主要介紹了C語言中二維數(shù)組指針的簡要說明,文章后也附送一個小練習題進行鞏固,需要的朋友可以參考下

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

 a[2][4]={{1,2.3},{4,5,6}}

 a+i,&a[i],*(a+i),a[i],

這四個表達式到底表示什么呢?

先告訴答案吧,其實這幾個表達式都是指向同一個地址的,也許你會很詫異,也會很疑惑,怎么會是這樣呢?。∈聦嵶C明就是這樣的,

2015810163408432.jpg (205×93)

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

 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]”轉(zhuǎn)換為“char **”

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

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

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

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

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

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

注意:只有把二維數(shù)組改成一個指向向量的指針數(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ā)里講的很透徹:(以下這段文字及對比一定要認真分析!)

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

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

2015810163503937.jpg (543×184)

下面再看一個網(wǎ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是一個指向 int [3] 的指針,即ptr的類型和&arr1的類型是一樣的,注意:arr1指向的內(nèi)存區(qū)域定長 
  int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}}; 
  // ptr2是一個指向 int * 的指針,即ptr2的類型和&ptr是一樣的,注意:ptr指向的內(nèi)存區(qū)域不定長 
  int * ptr2[3]={arr1,arr2,arr3}; 
  // ptr3是一個指向 int [3] 的指針,即ptr3的類型和&arr1的類型是一樣的,注意:arr1指向的內(nèi)存區(qū)域定長 
  int(* ptr3)[3]=&arr1; 
  ptr3=ptr1; // 沒錯,他們的類型相同 
 // ptr3=ptr2;//error 無法從“int *[3]”轉(zhuǎn)換為“int (*)[3] 
 // ptr4是一個指向 int * 的指針,即ptr4的類型和&ptr是一樣的,注意:ptr指向的內(nèi)存區(qū)域不定長 
  int ** ptr4; 
  //ptr4=&arr1; //error 無法從“int (*)[3]”轉(zhuǎn)換為“int ** 
  ptr4=ptr2; // 沒錯,他們的類型相同 
 //ptr4=ptr3; // error 無法從“int (*)[3]”轉(zhuǎn)換為“int ** 
  return 0; 
}


相關文章

  • include包含頭文件的語句中,雙引號和尖括號的區(qū)別(詳解)

    include包含頭文件的語句中,雙引號和尖括號的區(qū)別(詳解)

    下面小編就為大家?guī)硪黄猧nclude包含頭文件的語句中,雙引號和尖括號的區(qū)別(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • FFmpeg進階教程之給視頻添加文字水印

    FFmpeg進階教程之給視頻添加文字水印

    FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序,下面這篇文章主要給大家介紹了關于FFmpeg進階教程之給視頻添加文字水印的相關資料,需要的朋友可以參考下
    2022-11-11
  • opencv利用視頻的前n幀求平均圖像

    opencv利用視頻的前n幀求平均圖像

    這篇文章主要為大家詳細介紹了opencv利用視頻的前n幀求平均圖像,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • c++帶有string的結(jié)構體賦值和清零問題

    c++帶有string的結(jié)構體賦值和清零問題

    這篇文章主要介紹了c++帶有string的結(jié)構體賦值和清零問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • C++結(jié)構體字節(jié)對齊和共用體大小

    C++結(jié)構體字節(jié)對齊和共用體大小

    這篇文章主要介紹了C++結(jié)構體字節(jié)對齊和共用體大小,結(jié)構體內(nèi)存對齊在筆試和面試中經(jīng)常被問到,所以這篇文章做個總結(jié),首先通過代碼驗證不同結(jié)構體的內(nèi)存大小,需要的朋友可以參考下
    2021-11-11
  • C++ 輸入一行數(shù)字(含負數(shù))存入數(shù)組中的案例

    C++ 輸入一行數(shù)字(含負數(shù))存入數(shù)組中的案例

    這篇文章主要介紹了C++ 輸入一行數(shù)字(含負數(shù))存入數(shù)組中的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++中sprintf()函數(shù)的使用詳解

    C++中sprintf()函數(shù)的使用詳解

    本篇文章是對C++中sprintf()函數(shù)的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 淺談QT內(nèi)存泄漏

    淺談QT內(nèi)存泄漏

    本文主要介紹了淺談QT內(nèi)存泄漏,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C語言實現(xiàn)任何文件的加密解密功能

    C語言實現(xiàn)任何文件的加密解密功能

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)任何文件的加密解密功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C++中vector的模擬實現(xiàn)實例詳解

    C++中vector的模擬實現(xiàn)實例詳解

    vector是表示可變大小數(shù)組的序列容器,它也采用連續(xù)存儲空間來存儲元素,因此可以采用下標對vector的元素進行訪問,這篇文章主要給大家介紹了關于C++中vector模擬實現(xiàn)的相關資料,需要的朋友可以參考下
    2021-11-11

最新評論