【指標大佬的原創】說出來你們可能不信,但是陣列名確實不是指標常量
這篇是一篇C語言勸退流教學文,看不懂的同學應該是勸退教學流的目標物件
(寫完了才想起來注一下,本文提到的“陣列”和“陣列名”字樣,指的是陣列左值表示式(array lvalue expression)或陣列宣告(array declaration)所宣告的變數)
首先,陣列名不是常量指標,從兩方面:
- 型別方面,陣列的型別是type[size],和常量指標型別type* const不同
- 使用方面,sizeof(陣列名)等於陣列所有元素的大小,而不是sizeof(指標);對陣列取地址,得到的指標進行加減,增減位元組數是sizeof(陣列);你可以用字串字面量初始化一個字元陣列,但是不能用常量指標來初始化一個字元陣列。
其次,為什麼很多老師都說陣列是常量指標:
- 他們不瞭解C語言的型別系統和隱式轉換規則
- 他們怕下面的人聽不懂
- 他們解釋不清為什麼陣列名不能進行賦值或者++之類的運算而指標可以
切入正題,我們從型別系統和隱式轉換規則來講:
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 480【WQH大佬的逃♂離】 的題解
這道題是我在英語課的時候感覺無聊,而又看到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 && 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個屬性