標籤:hand -1016 二位元組 handle hello 位元組 符號 經典 編譯
視頻參看csdn學院王陽和下面的linux環境下c語言編程基礎相當的經典,其中王陽的視頻講的很好,相當的經典
編譯hellogcc.c需要依賴/home目錄下的標頭檔
為了避免同一個檔案被include多次,C/C++中有兩種方式,一種是#ifndef方式,一種是#pragma once方式。在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 聲明、定義語句
#endif
方式二:
#pragma once
... ... // 聲明、定義語句
#ifndef的方式受C/C++語言標準支援。它不光可以保證同一個檔案不會被包含多次,也能保證內容完全相同的兩個檔案(或者程式碼片段)不會被不小心同時包含。
上面定義了一個define_test.h標頭檔
使用extern引用外部檔案定義的變數和函數
使用static聲明的變數和函數,在外面使用extern是無法訪問的。、
整形變數儲存的是整形資料,
指標變數儲存的是地址
32位對應的指標變數是4個位元組
64位對應的指標變數時8個位元組
PValue是一個指標變數,在32位的電腦上sizeof始終是4個自己,在64位上結果是8個位元組。
*pValue的值就0X01
pValue+1的地址0X00012B40+sizeif(char)*1 = 0X00012B41
*( pValue+1)的值是0X02
0X00102000這個地址不是malloc申請的,可能是系統的地址,我們向該地址的空間寫值,會導致系統奔潰
上面就是一種野指標,可能導致程式奔潰。
上面pValue能訪問四個位元組,但是只要0X00012B40是申請過的,0X00012B41,0X00012B42,0X00012B43的地址空間裡面可能儲存很重要的資料,你把100儲存在裡面,就可能會導致系統奔潰。
上面這張模式是大段儲存
用下面的代碼就可以:
Signal是一個函數,該函數有兩個參數,一個是int,一個是handle的函數指標,該函數的傳回值是一個地址*,例如地址是aa。就變成int(*aa)(int y)
指標比較比較的是地址編號的大小,不是比較裡面的值
就像是郵箱,郵箱有編號,每個編號的郵箱裡面儲存的值不一樣
上面這種指標指向的內容是唯讀,是不能發送變化的
是錯誤的,不能給指標賦值,指標是常量
先執行p1++,在執行指標指向空間的值。
輸出的結果是300
數組的指標就是數組名稱或者數組第一個元素的地址,數組名稱是常量是不能加減運算的
上面是有問題的,因為p2指標已經移動了字串的最後,應該將p2該成b
第一種情況:數組的內容是hello,數組的長度是6,字串最後帶有’/0’
第二種情況:數組的內容是hello,最後那個‘/0’不能儲存,數組的長度是5
第三種情況:數組的內容是hell0,數組的長度是10
上面這個分析是錯誤的,運行代碼的時候報錯
啟動並執行時候報錯,所以這個地方數組名不能代表第一個元素的地址
上面輸出的結果是4和25,如果array代表第一個元素的地址,那麼array是一個地址,輸出的結果應該是4而不是25,但是這裡輸出25,說明array在這個地方的代表的是整個數組的地址
說明這種情況下,數組名代表的是整個數組
總結:
上面數組名在sizeof和&之後,說明數組名代表的是整個數組
第一個情況是求整個數組的儲存空間
第二個是對整個數組取地址,要保證整個數組的空間
這種情況array代表的就是第一個元素的地址
上面是正確的相當的經典
例子2:
Ptr代表二位元組中第一個元素的地址,該元素是一個數組,有三個元素
Ptr+1代表該數組中的第二個元素的地址
列子3:
上面中*ptr就是第一個元素的地址就是數組名array,訪問第一個元素的值就是**ptr
第二個元素的地址就是*ptr+1,得到第二個元素的值就是*(*ptr+1)
上面*ptr=array[0],*(ptr+1)等於array[1]
左值儲存left的變數地址0x000012B4在編譯期間就分配了儲存空間的地址
右值在啟動並執行時候在知道
程式在編譯的時候就產生了上面的符號表,記錄了array和temp對應的記憶體位址
所以數組是直接存取,指標因為放存了2次,所以叫做間接訪問
如果把數組當成指標去訪問會出現下面的錯誤:
A的ascll的值就是61 b對應的是62
Extern的例子
在a.c中定義了一個數組,在b.c中使用extern聲明這個數組,將數組的內容列印出來
但是下面的情況就會出現錯誤,把一個數組當成指標來訪問
linux下的c語言編程學習筆記