日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组的本质分析

發布時間:2025/4/5 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组的本质分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 數組的基本概念
      • 1.1 數組的概念
      • 1.2 數組的大小
    • 2 數組名
      • 2.1 數組地址與數組名
      • 2.2 數組名的盲點
    • 3 a和&a的區別
      • 3.1 a和&a的區別
    • 4 二維數組
      • 4.1 二維數組的概念
      • 4.2 二維數組的數組名

1 數組的基本概念

1.1 數組的概念

數組是相同類型的變量的有序集合。

1.2 數組的大小

數組的大小:

  • 數組在一片連續的內存空間中存儲元素。
  • 數組元素的個數可以顯示或隱式指定。


a[2] = 0, a[3] = 0, a[4] = 0;b中包含了2個元素。


2 數組名

2.1 數組地址與數組名

關于數組地址和數組名:

  • 數組名代表數組首元素的地址。
  • 數組的地址需要用取地址符號&才能得到。
  • 數組首元素的地址值與數組的地址值相同。
  • 數組首元素的地址與數組的地址是兩個不同的概念。

2.2 數組名的盲點

數組名必須知道如下幾點:

  • 數組名可以看作一個指針常量。
  • 數組名“指向”的是內存中數組首元素的起始位置。
  • 數組名不包含數組的長度信息。
  • 在表達式中數組名只能作為右值使用。
  • 只有下列場合中數組名不能看作常量指針。
    • 數組名作為sizeof操作符的參數。
    • 數組名作為&運算符的參數。

數組名在大多數情況下被當成常量指針處理,但是數組名并不是指針,不能將其等同于指針!


3 a和&a的區別

3.1 a和&a的區別

a和&a的區別如下:

  • a為數組首元素的地址。
  • &a為整個數組的地址。
  • 兩者類型不同。
  • a和&a的區別在于指針運算。

示例代碼:

#include <stdio.h>int main() {int a[5] = {1, 2, 3, 4, 5};int* p1 = (int*)(&a + 1); int* p2 = (int*)((int)a + 1);int* p3 = (int*)(a + 1);printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);return 0; }// p1[-1]輸出5,p2[0]輸出33554432, p3[1]輸出3(小端系統)

4 二維數組

4.1 二維數組的概念

二維數組的基本概念:

  • 二維數組在內存中以一維的方式排布。
  • 二維數組的第一維是一維數組。
  • 二維數組中的第二維才是具體的值。
  • 二維數組的數組名可看作常量指針。

    注意:內存中并不存在a[0]、a[1]、a[2]這一維。

二維數組的遍歷:

#include <stdio.h> #include <malloc.h>void printArray(int a[], int size) {int i = 0;printf("printArray: %d\n", sizeof(a));for(i=0; i<size; i++){printf("%d\n", a[i]);} }int main() {int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};int* p = &a[0][0];int i = 0;int j = 0;for(i=0; i<3; i++){for(j=0; j<3; j++){printf("%d, ", *(*(a+i) + j));}printf("\n");}printf("\n");printArray(p, 9);return 0; }

4.2 二維數組的數組名

一維數組名代表數組首元素的地址:

  • int a[5],a的類型為int*。
    二維數組名同樣代表數組首元素的地址:
  • int m[2][5],m的類型為int(*)[5]。

結論:

  • 二維數組名可以看作是指向數組的常量指針。
  • 二維數組可以看作是一維數組。
  • 二維數組中每個元素都是同類型的一維數組。
  • 動態申請二維數組:

    #include <stdio.h> #include <malloc.h>int** malloc2d(int row, int col) {int** ret = NULL;if( (row > 0) && (col > 0) ){int* p = NULL;ret = (int**)malloc(row * sizeof(int*));p = (int*)malloc(row * col * sizeof(int));if( (ret != NULL) && (p != NULL) ){int i = 0;for(i=0; i<row; i++){ret[i] = p + i * col;}}else{free(ret);free(p);ret = NULL;}}return ret; }void free2d(int** p) {if( *p != NULL ){free(*p);}free(p); }int main() {int** a = malloc2d(3, 3);int i = 0;int j = 0;for(i=0; i<3; i++){for(j=0; j<3; j++){printf("%d, ", a[i][j]);}printf("\n");}free2d(a);return 0; }

    參考資料:

  • C語言進階剖析教程
  • 總結

    以上是生活随笔為你收集整理的数组的本质分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。