1. 程式人生 > >c語言那些細節之a+1和&a+1的區別

c語言那些細節之a+1和&a+1的區別

首先a是一個數組名,當看到這個a與&a時,一般我們的理解都是這個陣列的首地址。沒錯,如果加上列印的話,確實兩個值是一樣的。

不過&a是整個陣列的首地址,a則是陣列首元素的地址,雖然值一樣,但是意義卻不相同。

在此之前有必要先看下c程式在記憶體中的分佈圖。

下面來看一個例子吧還是。

示例程式碼:

  1. #include <stdio.h>  
  2. int main(int argc, char *argv[])  
  3. {  
  4.     int i;  
  5.     int a[]={1, 2, 3, 4, 5};  
  6.     int s;  
  7.     int *p = (int *)(&a+1);  
  8.     printf(" a = %p\n&a = %p\n", a, &a);  
  9.     for(i = 0; i < 5; i++)  
  10.         printf("a[%d] = %p\n", i, &a[i]);  
  11.     printf(" p = %p\n&p = %p\n&s = %p\n", p, &p, &s);  
  12.     return 0;  
  13. }  

執行結果:

  1. a = 0022FF40  
  2. &a = 0022FF40  
  3. a[0] = 0022FF40  
  4. a[1] = 0022FF44  
  5. a[2] = 0022FF48  
  6. a[3] = 0022FF4C  
  7. a[4] = 0022FF50  
  8.  p = 0022FF54  
  9. &p = 0022FF38  
  10. &s = 0022FF3C  

由上面的執行結果,我們可以知道a和&a的區別了。可得下圖:

因為是執行在main函式體內的變數,所以這些都是在棧中執行的,所以p指標是指向了a[4]後的那個地址,而p本身的地址是在棧中分配的。

綜上可知:

  1. &a+i = a + i*sizeof(a);          所以&a+1就是偏移的是一個數組長度。
  2. a+i = a +i*sizeof(a[0]);   

相關推薦

c語言那些細節a+1&a+1區別

首先a是一個數組名,當看到這個a與&a時,一般我們的理解都是這個陣列的首地址。沒錯,如果加上列印的話,確實兩個值是一樣的。 不過&a是整個陣列的首地址,a則是陣列首元素的地址,雖然值一樣,但是意義卻不相同。 在此之前有必要先看下c程式在記憶體中的分佈圖。

C 語言結構體點運算子( . )箭頭運算子( -> )的區別

很多時候,在對結構體進行相應的編碼時,時而發現是用點運算子( . ),時而是用箭頭運算子( -> );那麼這兩者之間的使用有什麼區別麼? 相同點:兩者都是二元操作符,而且右邊的運算元都是成員的名稱。不同點:點運算子( . )的左邊運算元是一個結果為結構的表示式;     

C語言簡單入門結構體連結串列

C語言的連結串列也是一個很重要很難啃的骨頭,我是這麼覺得的! 以下只是個人對連結串列的總結和記錄方便日後複習所用,如有錯誤,請留言狠批,謝謝! 先說下連結串列的簡單實現:  如上圖,我們定義一個結構體: 1,2,3,4,5是結構體資料。a,b,c,d,e則是指標變

C 語言結構體點運算子( . )箭頭運算子( -> )的區別

很多時候,在對結構體進行相應的編碼時,時而發現是用點運算子( . ),時而是用箭頭運算子( -> );那麼這兩者之間的使用有什麼區別麼? 相同點:兩者都是二元操作符,而且右邊的運算元都是成員的名

C++語言筆記系列十八——虛函數(1

自己 語言 數據類型 說明 出現 adium 重定義 angle rac 1.C++中的多態 (1)多態性:同一個函數的調用能夠進行不同的操作,函數重載是實現多態的一種手段。 (2)聯編:在編譯階段進行聯接。即是在編譯階段將一個函數的調用點和函數

C語言異常處理 setjmp()longjmp()

divide font 變量 bsp ron 否則 sharp highlight == 異常處理之除0情況 相信大家處理除0時,都會通過函數,然後判斷除數是否為0,代碼如下所示: double divide(doublea,double b) { co

輸入一行字元分別統計出其中英文字母、空格、數字其他字元的個數。(用c++語言編寫程式)【寫的第1篇部落格,很高興

#include<stdio.h> int main() { char ch; //定義ch為字元型變數 int a=0,b=0,c=0,d=0; //定義a,b,c,d為整型變數並賦初值 while(scanf("%c",&ch),ch!=’\n’) //輸入字元直到c

C語言程式設計 細節總結(1-7章)

C語言細節總結 溫故而知新,許久沒看C語言,發現了一些從前沒注意的小細節,總結下來~ 第1章C語言及C程式概述 1.C語言有34中運算子、32個關鍵字、9中控制語句 第2章資料型別、運算子與表示式 2.實型常量只採用十進位制,表示方法:十進位制小數形式、指數形式

C語言筆試題——BOOL,int,float,指標型別的變數a 與“零”的比較

Bool型: if(a) if(!a) BOOL型,沒什麼好講的,無非就是true或false判斷 int型: if(0 == a) if(0 != a) float型: const float EPSILON=0.000001; if(abs(a)<=E

資料結構---C語言實現哈夫曼樹編碼

//哈夫曼樹 //楊鑫 #include <stdio.h> #include <stdlib.h> typedef int ElemType; struct BTreeNode { ElemType data; struct BTr

C語言資料結構靜態連結串列實現(A-B)U(B-A)

時間複雜度O(3n)不是很難,直接貼程式碼:StaticLinkList.h#ifndef _STATIC_LINK_LIST_H_ #define _STATIC_LINK_LIST_H_ #define MAXSIZE 100 typedef enum {ERROR,OK

資料結構(C語言)學習路(1)——緒論

小白學習資料結構,從基礎知識開始整理起。 1.資料結構是什麼? 2.資料結構在哪裡用? 3.資料結構怎麼用? 小白在開始學習資料結構,提出了這三個問題,希望到學習完成之後可以解決這三個問題。 小白從《大話資料結構》這本書開始學習。 基本概念: 資

C語言的本質(29)——C語言與彙編暫存器定址方式

x86的通用暫存器有eax、ebx、ecx、edx、edi、esi。這些暫存器在大多數指令中是可以任意選用的,比如movl指令可以把一個立即數傳送到eax中,也可傳送到ebx中。但也有一些指令規定只能用其中某些暫存器做某種用途,例如除法指令idivl要求被除數在eax暫存器中

c51一般c語言的不同

   c語言和c51大部分的地方都是相同的,他們的語句,結構,順序都是很相似的,只是c51相比與c語言,多了很多變數型別和其他的東西,下面是總結c語言和c51的一些不同之處。   變數型別   位變數

【黑馬程式設計師】Objective-C語言學習筆記物件的建立、使用方法呼叫(三)

--------------------------------------------IOS期待與您交流!-------------------------------------------- 一、物件的建立 物件是由類建立,我們使用上一文章用到的類來建立物件。 說明:

C++學習(三十)(C語言部分)隊列

emp 等於 -s etc amp class font pri 先進先出 數據結構1.保存數據 2.處理數據數組+操作增查刪改 棧和隊列是一種操作受限的線性表 棧 是先進後出 是在一端進行插入刪除的操作--->棧頂 另一端叫做棧底(棧和棧區是兩個概念)(是

C語言程式設計入門--第五章C語言基本運算表示式-part1

  導讀:程式要完成高階功能,首先要能夠做到基本的加減乘除。本章從程式中變數的概念開始,結合之前學的輸出函式和新介紹的輸入函式製作簡單人機互動程式,然後講解最基礎的加減法運算,自制簡單計算器程式練手。    5.1 變數 5.1.1 變數宣告定義與賦值表示式   上一章講了資料型別,資料型別要和變數結合在一起

C語言程式設計入門--第五章C語言基本運算表示式-part2

5.1.4 再來一個C庫函式getchar吸收回車鍵   回車鍵也是一個字元,在使用scanf的時候,輸入完畢要按下回車鍵,這時候回車鍵也會被輸入到stdin流中,會搞亂我們的程式。   注意:stdin是輸入流,stdout是輸出流,這兩個流就是在記憶體中流進流出的資料,根據流向不同命名也不同。   比如以

C語言程式設計入門--第五章C語言基本運算表示式-part3

5.3  挑幾個運算子來講     常用的運算子除了加減乘除(+-*/)外,還有如下:   注意:以下運算子之間用逗號隔開,C語言中也有逗號運算子,這裡不講逗號運算子。  1. 賦值運算子 =,+=,*=   2. 一元運算子 +

C語言數組冒泡排序+折半查找法(二分查找)

不存在 次數 存在 是否 .com int count 結束 如果 冒泡排序算法 1 int num[5]; 2 int i; 3 //循環接收用戶輸入的元素 4 for(i=0;i<5;i++){ 5 pr