首先這裡強調乙個問題就是假設我現在知道乙個記憶體位址0xaa11 我怎樣將這個位址直接給乙個指標呢? 首先這樣是沒有語法錯誤的 確實也是這樣定義的 但是位址我們是不能隨便規定的 這個主要用於程式開發中我們向特定的位址(我們已知的位址)去寫入資料(例如:通過i2c介面傳送到mcu乙個位址資料(unsigned char addata),乙個待寫入資料(unsigned char dadata)。)
希望將dadata的值寫到mcu記憶體位址為addata的暫存器當中。
#includevoid main()
某些編譯器在直接賦值也是可以通過的
p = 0xaa11;
但是我隨便給乙個位址去執行大多數情況肯定會宕機
這個現在只需要了解這種寫法
首先,要確認這部分記憶體是存在的,如果不存在要申請指定位址的記憶體空間。其次,要獲取修改許可權,不論是別人的程序還是我們自己的程序都要拿到許可權才能執行操作。最後,關於是否要進核心,這要看對方有沒有寫防護了,如果在核心層面寫了保護,那肯定要進核心才能解決問題了。如果沒有保護,或者三環的保護,三環內的**就能搞定。
還有一種靠譜的說法就是 會修改虛擬記憶體 也就是偏移後的記憶體位址 肯定不會是真的記憶體位址 這個其實也跟作業系統有關係 所以理解沒必要去深究了
這些都屬於最簡單的寫法 前面的部落格也有過介紹
指標在這裡兩個應用就是可以通過乙個函式修改多個值
f1(int *p, int *p2, ...)
這種寫法很重要 當然將多個資料封裝成結構體也可以將多個改變返回
因為指標是直接將所指向的記憶體空間修改 就不涉及變數間的操作 而你使用類似於這種操作時本質上並未改變a的值
基本等價於
f()唯一的區別是f(int b)這種寫法int b具有對外屬性 可以通過主函式對它進行初始化
第二個應用就是利用指標快速多個的操作與運算 對於子函式與主函式之間的分層意義重大
//函式呼叫時,形參傳給實參,實參取位址傳給形參 在被呼叫函式裡面使用*p,來改變實參,把運算結構傳出來
//不同的函式通過指標同時操作一塊記憶體空間
函式引數==》介面的封裝和設計==》模組的劃分==》軟體的分層
1.定義兩個變數
int a;
int *p;
2.建立關聯
p = &a;
3.通過*p修改記憶體
*p = 0;
這三個條件自由的組合產生重要的語法現象
1.1 2 3 寫在乙個函式
2.1 2 寫在一起 3寫在另外乙個函式 (函式呼叫)
.3.1 單獨寫 2 3 寫在一起 c++裡會應用
#include#include#includevoid f(char **p2);
void f(char **p2)
void main()
這段**不一定能夠執行 原因看開頭我們這裡的位址不一定是我們可以修改的位址
這是講解一下這種寫法與內在的意義
#include#include#includef(char **p1, int *len1, char **p2, int *len2)
void main()
if(p2 != null)//釋放p2記憶體
指標做函式引數,問題的實質不是指標,而是看記憶體塊,記憶體塊是 1 維、2 維。
1)如果基礎類 int 變數,不需要用指標;
2)若記憶體塊是 1 維、2 維,需要指標。
C語言 陣列與指標高階(二)
c語言中能否靈活應用指標就能看出你的c語言功底如何,接下來是我對在學習指標過程中,對一下較為苦澀概念的理解及總結。指標的運算可歸納為以下三部分 1 指標 整數 一般來說,此類運算只是左右移動指標所指向陣列元素的位置而已 若指標指向的是 陣列名,此時其加1,則移動的是乙個陣列了,不是乙個元素 2 指標...
C語言 高階指標
import import myfunction.h 巨集後面不要加分號 define kimagewidth 200 define kimageheight 200 有引數的巨集 define kmax a,b a b a b 加上括號 define kmul a,b a b define and...
C語言的指標(高階篇章之二)
而今天的主角 指標,則是用於儲存位址,它在c語言使用中和陣列名是緊密的聯絡在一起。include int main for int i 0 i 3 i putchar 10 研究陣列名a的大小 printf a p n a printf a 0 p n a 0 printf a 1 p t a 1 ...