基礎知識
1.定義:指標是乙個變數。(指向位址)
eg:int * ptr;// 定義乙個指向整型的指標,當然也可以是char型。
**2.**間接運算子 : * (解引用運算子)
一元運算子:& (進行取位址)
eg:
int * ptr; //定義乙個整型指標變數
int n = 10; //定義乙個整型
ptr = &n; //將ptr指向n
此時 *ptr == 10; 間接運算子就是取位址上所存在的值。
指標的自加減(有的小夥伴內心是絕望的,前面正常的自加減還沒太搞懂,現在又來了指標的自加減…)
int * ptr;
int a[5] = ;
ptr1 = a; //ptr此時指向了a[0],也就是1. (陣列名就是陣列的首位址!)
ptr2 = a;
printf("%d, %p", *ptr1, ptr1); //位址一般用%p輸出, 編譯器不支援的用%x, 實在不行那就%d輸出吧,反正差不多,不過一般是以十六進製制輸出位址
從這可以看出指標的自加減規則和前面的是一樣的
++ptr, 先自加,此時是位址的自加,注意這裡不是加1,而是加(基型別)(對應的位元組),比如這裡的整型,加了四個位元組。
*++ptr, 那就是此時的指標往後移四個位元組,指向下乙個整型資料,如果這樣不能理解的話,就像老師當初交給我們的一樣,如果值是加1,那意義在**,加了乙個位元組,那只真指向了什麼?
*++ptr, 這個就是先取ptr所指向的數,再加1,這個應該好理解。
可能細心的同學會問,上面為什麼要定義兩個指標變數呢?
其實我的當初想法是這樣的:
*****1.為什麼第三行輸出為3:*****如果用同乙個指標,指標的每次變化都記錄在案,指標可是很敏感滴,
比如上圖ptr++, 指標在結束本語句後,會指向下乙個位址,然後,*ptr++, 指標又要指向下一位,因此這乙個語句中ptr移動了2位,也就是(2 4)個位元組。
因此數字就由1向後移兩位,輸出為3.(位址也是向後移了兩位,8個位元組)
2.為什麼第二行輸出的位址和第一行不一樣(加了四個位元組,也就是自加了)
,但是我們不都是說加號在後面是在結束後再加的嗎?
其實是在結束後再加的,但是別忘記(*ptr++ 和 ptr++在同一行
),一行全部執行完畢再列印,讓我們來執行一下:
1.執行 ptr++, 此時ptr的位址是不變的
2.執行 *ptr++,此時ptr++的自加就要發生作用了,*ptr++的值還是(ptr),而ptr已經自加了 『1』 .
3.輸出:已經變了的ptr,和還未變的ptr。給我們的視覺效果就是輸出的位址變了,而值卻未變。
關於指標的初步了解(一)
存放乙個字元的位址的指標稱為字元指標,存放乙個整形變數的位址的指標稱為整形指標,除此之外,存放乙個陣列位址的指標稱為陣列指標,存放乙個函式位址的指標稱為函式指標 任何乙個變數在記憶體中都有位址,任何位址 的存放都在指標裡 首先,陣列指標是陣列還是指標?答案是 陣列指標屬於指標。int main 整形...
指標初步認識
int a 10 p p a 0 p a 形式 含義 p p先加1,再取p的值 p p指向的物件加1 有 p 和 p 先取 p的值,再p 指標間可以相減,不可相加,相加無實際意義。說明 是變址運算子,即a i a i 使用指標指向陣列元素注意事項 1.可以通過改變指標變數的值指向不同元素 2.不用p...
初步了解指標
在電腦科學中,指標是程式語言中的乙個物件,利用位址,它的值直接指向存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為 指標 意思是通過它能找到以它為位址的記憶體單元。1.字元指標 char 概念 指的是指向的記憶體單元中儲存的是字元...