c語言那些細節之a+1和&a+1的區別
首先a是一個數組名,當看到這個a與&a時,一般我們的理解都是這個陣列的首地址。沒錯,如果加上列印的話,確實兩個值是一樣的。
不過&a是整個陣列的首地址,a則是陣列首元素的地址,雖然值一樣,但是意義卻不相同。
在此之前有必要先看下c程式在記憶體中的分佈圖。
下面來看一個例子吧還是。
示例程式碼:
- #include <stdio.h>
- int main(int argc, char *argv[])
- {
- int i;
- int a[]={1, 2, 3, 4, 5};
- int s;
- int *p = (int *)(&a+1);
- printf(" a = %p\n&a = %p\n", a, &a);
- for(i = 0; i < 5; i++)
- printf("a[%d] = %p\n", i, &a[i]);
- printf(" p = %p\n&p = %p\n&s = %p\n", p, &p, &s);
- return 0;
- }
執行結果:
- a = 0022FF40
- &a = 0022FF40
- a[0] = 0022FF40
- a[1] = 0022FF44
- a[2] = 0022FF48
- a[3] = 0022FF4C
- a[4] = 0022FF50
- p = 0022FF54
- &p = 0022FF38
- &s = 0022FF3C
由上面的執行結果,我們可以知道a和&a的區別了。可得下圖:
因為是執行在main函式體內的變數,所以這些都是在棧中執行的,所以p指標是指向了a[4]後的那個地址,而p本身的地址是在棧中分配的。
綜上可知:
- &a+i = a + i*sizeof(a); 所以&a+1就是偏移的是一個數組長度。
- 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