欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次

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

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

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

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

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

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

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

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

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

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

來看一道題目:

char **p,a[6][8]; 問p=a是否會導(dǎo)致程序在以后出現(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ā)里講的很透徹:(以下這段文字及對比一定要認(rèn)真分析?。?/p>

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

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

下面再看一個網(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是一個指向 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; 
}


上一篇:詳細(xì)解析C語言中的開方實現(xiàn)

欄    目:C語言

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

本文標(biāo)題:C語言中二維數(shù)組指針的簡要說明

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2903.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

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

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

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有