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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/6/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言-数组名真的不是指针 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 1 前言
  • 2 關(guān)于一維數(shù)組
  • 3 sizeof運(yùn)算符和自增運(yùn)算符
  • 4 數(shù)組名也不是常量指針
  • 5 總結(jié)

1 前言

參照我之前的兩篇文章:
二維數(shù)組做函數(shù)的參數(shù)
動(dòng)態(tài)創(chuàng)建二維數(shù)組

事實(shí)告訴我們,二維數(shù)組名不等于二級指針

2 關(guān)于一維數(shù)組

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

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

3 sizeof運(yùn)算符和自增運(yùn)算符

1、sizeof 指針是指針的大小,sizeof 數(shù)組名是整個(gè)數(shù)組的大小

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、指針可以遞增操作,而數(shù)組名不可以

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

這里出現(xiàn)了兩個(gè)問題:

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

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

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

    事實(shí)上,查閱資料可以發(fā)現(xiàn):

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

    2、觀察下面例子,詳細(xì)內(nèi)容可以參見 這里

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

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

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

  • 對數(shù)組名取地址的時(shí)候
  • 用sizeof運(yùn)算符運(yùn)算的時(shí)候
  • 用字符串字面量初始化數(shù)組的時(shí)候
  • 5 總結(jié)

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

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。