linux下的c語言編程學習筆記

來源:互聯網
上載者:User

標籤: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語言編程學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.