日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C语言-数组名真的不是指针

發布時間:2025/6/17 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言-数组名真的不是指针 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1 前言
  • 2 關于一維數組
  • 3 sizeof運算符和自增運算符
  • 4 數組名也不是常量指針
  • 5 總結

1 前言

參照我之前的兩篇文章:
二維數組做函數的參數
動態創建二維數組

事實告訴我們,二維數組名不等于二級指針

2 關于一維數組

對于一維數組,用一級指針指向數組名,用一級指針做參數傳遞一維數組,似乎毫無問題。

void f(int *p); int main(void) {int arr[2];int *p = arr;f(arr);return 0; }

3 sizeof運算符和自增運算符

1、sizeof 指針是指針的大小,sizeof 數組名是整個數組的大小

int *p; int arr[4]; printf("sizeof(p) = %d \n", sizeof(p)); printf("sizeof(arr) = %d ", sizeof(arr));Output: sizeof(p) = 8 sizeof(arr) = 16

2、指針可以遞增操作,而數組名不可以

int arr[4] = {1, 2, 3, 4}; int *p = arr; printf("*(++p) = %d", *(++p)); // Output:*(++p) = 2 printf("*(++arr) = %d", *(++arr)); // errorOutput error: error: lvalue required as increment operand

這里出現了兩個問題:

  • 數組名不能遞增,那數組名可能是常量指針啊 int *const arr
  • 根據錯誤提示,數組名是不能作為左值的,數組名只能作為右值
  • 4 數組名也不是常量指針

    1、常量指針可以作為左值,而數組名不可以:

    int i = 1; int arr[2]; int *const p = &i; // OK arr = &i; // error

    事實上,查閱資料可以發現:

  • 數組的類型是 type[SIZE] (二維數組的類型是type(*)[SIZE])
  • 常量指針的類型是 type* const
  • 兩者并不是同一種數據類型,關于這一點:
    我個人認為在C語言中,數組也是一種數據類型,一種特殊的數據類型
    我們知道,在向函數傳遞二維數組的時候,我們使用了數組指針,即int (*p)[n]
    而數組指針,我們可以理解為C語言為數組創造的一種特殊的指針類型。

    2、觀察下面例子,詳細內容可以參見 這里

    printf("%#x \n", a); printf("%#x \n", &a); printf("%#x \n", &a[0]); printf("%#x \n", &a[0][0]);Output: 0x9ffe40 0x9ffe40 0x9ffe40 0x9ffe40

    我們可以發現,對于數組名,處于不同類型下,取得的值(地址)都是一樣的
    這個例子的意思是,數組名和指針存在著隱式轉換
    這也是很多人把數組名當作指針的原因,因為數組名在大多數的情況下都會隱式轉換為指針,由于數組名只能作為右值,所以指針也是一個右值的指針。

    既然大多數情況下會隱式轉換為指針,那么下面就是少數情況(不會轉換為指針):

  • 對數組名取地址的時候
  • 用sizeof運算符運算的時候
  • 用字符串字面量初始化數組的時候
  • 5 總結

    在C語言中,數組名確實和指針有著微妙的關系
    但是數組名并不是指針,由于它大部分情況下都表現為一個指針
    所以很多地方都認為它是指針,事實上并不是,它只是很像指針而已
    我個人認為數組是C語言中一種特殊的數據類型,有著特定類型的指針。

    總結

    以上是生活随笔為你收集整理的C语言-数组名真的不是指针的全部內容,希望文章能夠幫你解決所遇到的問題。

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