1. 程式人生 > >【指標大佬的原創】說出來你們可能不信,但是陣列名確實不是指標常量

【指標大佬的原創】說出來你們可能不信,但是陣列名確實不是指標常量

這篇是一篇C語言勸退流教學文,看不懂的同學應該是勸退教學流的目標物件

(寫完了才想起來注一下,本文提到的“陣列”和“陣列名”字樣,指的是陣列左值表示式(array lvalue expression)或陣列宣告(array declaration)所宣告的變數)

首先,陣列名不是常量指標,從兩方面:

  1. 型別方面,陣列的型別是type[size],和常量指標型別type* const不同
  2. 使用方面,sizeof(陣列名)等於陣列所有元素的大小,而不是sizeof(指標);對陣列取地址,得到的指標進行加減,增減位元組數是sizeof(陣列);你可以用字串字面量初始化一個字元陣列,但是不能用常量指標來初始化一個字元陣列。

其次,為什麼很多老師都說陣列是常量指標:

  1. 他們不瞭解C語言的型別系統和隱式轉換規則
  2. 他們怕下面的人聽不懂
  3. 他們解釋不清為什麼陣列名不能進行賦值或者++之類的運算而指標可以

切入正題,我們從型別系統和隱式轉換規則來講:

1. 陣列名的型別就是陣列型別type[size] (參見Array declaration) 對陣列取址,得到的型別是指向陣列的指標type(*)[size] (參見Member access operators)

2. 陣列名在大部分情況下會隱式轉換為首元素指標右值,除了(參見 Implicit conversions)

  • sizeof運算的時候
  • 取址的時候
  • 用字串字面量初始化字元陣列的時候

以及C11的_Alignof運算子(這個本文不考慮)

其他情況下都會發生陣列到指標隱式轉換,比如你用方括號取值,如果方括號左邊是個陣列,那麼陣列會被隱式轉換為首元素指標右值,然後對這個值進行的解引用。(參見Member access operators)

更進一步,二維陣列type[size1][size2],實際上就是元素型別是陣列的陣列,進行隱式轉換後得到的首元素指標型別是type(*)[size2],指向陣列的指標,對這個指標加減,得到的也是陣列的指標,對它解引用,得到陣列。

這一套過程,用那個什麼陣列名是常量指標的說法,是解釋不來的。

最後出一個題:

寫出程式輸出

typedef char(*AP)[5];

AP foo(char* p) {
    for (int i = 0; i < 3; i++) {
        p[strlen(p)] = 'A';
    }
    return (AP)p+1;
}

int main() {
    char s[] = "FROG\0SEAL\0LION\0LAMB";
    puts(foo(s)[1] + 2);
}

這個題用陣列名是指標那套理論是做不出來的。

相關推薦

指標原創出來你們可能但是陣列確實指標常量

這篇是一篇C語言勸退流教學文,看不懂的同學應該是勸退教學流的目標物件 (寫完了才想起來注一下,本文提到的“陣列”和“陣列名”字樣,指的是陣列左值表示式(array lvalue expression)或陣列宣告(array declaration)所宣告的變數) 首先,陣

出來你們可能但是陣列確實指標常量

這篇是一篇C語言勸退流教學文,看不懂的同學應該是勸退教學流的目標物件 (寫完了才想起來注一下,本文提到的“陣列”和“陣列名”字樣,指的是陣列左值表示式(array lvalue expression)或陣列宣告(array declaration)所宣告的變數

C++|STL學習筆記-map的基本操作(插入刪除遍歷到小輸出)仿寫法

首先的程式碼是插入,刪除,遍歷 執行截圖如下: 原始碼如下: #include <map> #include <iostream> #include <algorithm> using namespace std; typedef pair

SYZOJ 480WQH的逃♂離 的題解

這道題是我在英語課的時候感覺無聊,而又看到WQH大佬,於是突發靈感,想出了這道水題。 題目描述 眾所周知,WQH大佬非常NB,所以經常有很多人來找WQH大佬問問題或者Van♂遊戲。 但是WQH不能在別人身上花太多時間,因為他還有一個【資料刪除】,WQH每天需要抽

胡侃學習(理論)計算機推薦轉載以膜拜

《胡侃學習(理論)計算機》 作者: Sir (阿澀)   我也來冒充一回高手,談談學習計算機的一點個人體會。由於我是做理論的,所以先著重談談理論。   記得當年大一,剛上本科的時候,每週六課時數學分析,六課時高等代數,天天作業不斷(那時是六日工作制)。頗有些同學驚呼

原創datagridview動態綁定contextmenustrip並復制單元格數據

event args oar cells ren .get add cell ntc public class DGVCopy { public DataGridView DataGridViewCopy { get; set; }

POJ 1459 &amp;&amp; ZOJ 1734--Power Network流dinic

問題 -m memory ret wid bsp man 最大 中轉 Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions:

智力沖浪

for 出了 per 定期 中央電視臺 int 都是 pac iostream 【智力大沖浪】riddle內存限制: 128M【題目描述】例 1 智力大沖浪(riddle.pas)。【題目描述】小偉報名參加中央電視臺的智力大沖浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表

epub.js|翻譯|原創開源中間件epub.js的使用及其中文文檔

一個 () function cnblogs 文檔 rep 回調函數 arp 程序 小組項目 “基於JavaScript的讀書平臺” 正在開發中,預計年底上線。 由於之前有Flask框架的web開發經驗,產品的第一個版本我負責了web平臺搭建,技術選型: 服務器端:node

軟工 W班級總成績排名3

bsp ima href mage post www. lan src 案例 評分鏈接: alpha測試 軟件產品案例分析 總分排名: 【福大軟工】 W班級總成績排名3

1305. [CQOI2009]跳舞流+二分

else edge fine string 男女 nbsp CP ios clu Description 一次舞會有n個男孩和n個女孩。每首曲子開始時,所有男孩和女孩恰好配成n對跳交誼舞。每個男孩都不會和同一個女孩跳兩首(或更多)舞曲。有一些男孩女孩相互喜歡,而其他相互不

POJ 1273 Drainage Ditches流模版

ems 操作 AC LG 尋找 In size 兩種 ret 題意:現在有m個池塘(從1到m開始編號,1為源點,m為匯點),及n條有向水渠,給出這n條水渠所連接的點和所能流過的最大流量,求從源點到匯點能流過的最大流量 Dinic 1 #include<ios

算法類原創復雜網絡分析法中的還原論與整體論

總結 舉例 此外 都是 朋友 全部 基於 技術 pic 0)概述 前不久聽一位頗有造詣的老先生講了一堂關於仿真的講座,其中涉及到了還原論與整體論。於是借著先生的智慧,說說貫徹整個復雜網絡分析過程(包含復雜網絡的構建,下同)的還原論和整體論。

UOJ274 [清華集訓2016] 溫暖會指引我們前行 LCT生成樹

生成 size from down print truct ack pty play 題目分析: 差評,最大生成樹裸題。hack數據還卡常。 代碼: 1 #include<bits/stdc++.h> 2 using namespace std;

資料放送27頁PPT|資料科學在金融風控中的應用

本文是天善智慧簽約講師李雲的課程 資料科學在金融風控中的應用 https://edu.hellobi.com/course/296 課件,未經允許,禁止轉載。 分享內容:     1.金融風控與資料科學什麼關係 2.金融風險未來前

Pseudoforest HDU - 3367生成樹Kruskal

題目連結   題意:好坑的題啊,我一開始看了測試樣例以為是放進一棵樹中問最大的邊,每棵樹上最多成一個環,沒想可以放進多棵樹中,但是要求的是最大的邊權總和就行,那麼就是Kruskal的思想了,以降序排序,然後逐步存入邊,遇到已經成環的就放棄掉這條邊,因為它一定不是最優解。 #

POJ 2771 Guardian of Decency 獨立集

傳送門:http://poj.org/problem?id=2771 Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K

程式設計網格無水題動態規劃篇字串和

Written By MorrowWind,csdnicewing 可以到洛谷的P115上去練習  https://www.luogu.org/problemnew/show/P1115 題目描述         給出資料個

排序總結(JAVA)

文章目錄 排序總結 氣泡排序 桶排序 標準的桶排序 插入排序 希爾排序 選擇排序 計數排序 基數排序 堆排序 歸併排序 快速排序

整理原創 什麼是一維表什麼是二維表?

  錯誤概念: 一維表:是隻有1行資料的? 只有2個列的?   是空間上一維的,線的概念?NO 二維表:是空間上二維的,面的概念?NO   準確概念辨析 表:基礎概念,1行是1條資料,1列是1個屬性