記憶體四區
a) 代碼區。代碼
b) 全局區。全局的常量字元串常量“ABC” 變量
c) 棧區。系統自動開辟,系統自動釋放,并不是很大
d) 堆區。動态開辟的記憶體,手動開辟,手動釋放。大
位址
把記憶體以單個位元組為機關,分開,每一個編号,這個編号就是位址。
a) 編号是連續的
b) 唯一的
c) 取位址運算符:&單目運算符 優先級() [],結合性右往左
int a;
&a;
首位址
一段記憶體空間的第一個存儲單元的位址
指針變量
1.用來存放位址的變量,2.記憶體大小4個位元組
位址是編号,一種資料
整數 int a;
字元 char c;
小數 float b;
位址 指針變量
a) 指針變量的定義
int main(){
int a;
float b;
char c;
int *p; // 定義一個指針變量p,存的是位址。int指名指針指向的資料類型,*指名p這個變量是一個指針變量
}
b) 指針變量的指派
int a = 5;
int *p;
p = &a; //p指向a
c) 指針的引用
int a = 5;
int *p;
p = &a;
printf("a=%d", a);
printf("a=%d", *p);
通路a這個變量:
- 使用變量名,
-
指針通路:指針變量。取值運算符,傳回某一個位址中的值,單目運算符 右到左
注意了:再定義指針變量的時候int *p; 隻是表明p是一個指針變量。而非定義的時候p則是取值p指向的記憶體值。
C++基礎_指針
補充
野指針:不能明确指向的指針變量。危險。
int *p; // p裡面儲存的位址不确定,p的指向不明确的,重要資料有可能被操作到
解決方法:int *p = NULL;
空指針:int* float* char* double*
void* 轉換成其它的資料類型
指針變量的運算:+ - ++ -- 隻是作指針的偏移,去通路位址旁邊的一些記憶體
指針變量的加減,是以指針所指向的類型空間為機關進行偏移
int main(){
char *p; // 一個char占1個位元組,則p + 1表示p指向的位址偏移一個位元組
int *p1; // 一個int占4個位元組,則p1 + 1表示p1指向的位址偏移4個位元組
double *p2; // 一個double占8個位元組,則p2 + 1表示p2指向的位址偏移8個位元組
}
一維數組與指針
- 定義一個一維數組,數組名是這個數組的“首位址”
int main()
{
int a[5];
printf("a = %d\n", a);
printf("&a = %d\n", &a);
printf("a+1 = %d\n", a + 1);
printf("&a+1 = %d\n", &a + 1);
return 0;
}
結果:
a = 13630344
&a = 13630344
a+1 = 13630348
&a+1 = 13630364
解析:
a 指向a[0], a[0]是int元素, a的類型就是 int*
a 指向a[0] int元素, int* 4位元組
&a 這個位址指向整個數組, &a的類型就是 int(*)[5];(數組的指針)
-
通路數組的元素:
a) 下标法:a[0] a[1]
b) 指針法:
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int* p = a; // p指向a[0]
/*
p指向a[0]的位址
p+1指向a[1]的位址
...
p+4指向a[4]的位址
則取位址的值,使用取值運算符* *p、*(p+1)...*(p+4)
*/
for (int i = 0; i < 5;++i) {
printf("%d ", *(p + i)); // 或者這樣:printf("%d ", *p++);
}
// 結果為:1 2 3 4 5
return 0;
}
一些細節解析:
- 和 ++ 是單目運算符,優先級相同,從右往左結合
-
是雙目運算符,優先級<和++
是以(p+i)要加括号,而p++不需要(p++,先p++結合,然後再與*結合)
當然也可以這麼寫:
for (int i = 0; i < 5;++i) {
printf("%d ", *(a+i)); // 這裡不能用*a++,因為a是數組名,也是第一個元素的首位址,但它永遠都是數組名,這個主要意義不能忽略,是以就不能去a++
}
再次強調:
1. 數組名是這個數組的首位址
2. 首位址就是一段記憶體中第一個存儲單元的位址
二/多元數組與指針
需要知道:三維數組的存儲單元是一個二維數組,二維數組的存儲單元是一個一維數組,一維數組的存儲單元是一個元素
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
-
數組名a是這個二維數組的首位址,這個數組在記憶體中的第一個存儲單元是a[0],即這個一維數組
a的類型是:(數組的指針)int(*)[4]; 是以a+1 偏移16位元組
-
a[0]是一維數組的數組名,a[0]指向a[0][0];
a[0]的類型是:(int類型指針)int*; 所有a[0]+1 偏移4個位元組
#include <iostream>
using namespace std;
int main()
{
int a[2][3] = { {1, 2, 3}, {4, 5, 6} };
printf("a[1][2] = %d\n", a[1][2]); // 結果為:6
printf("a[1][2] = *(a[1] + 2) = %d\n", *(a[1] + 2)); // 結果為:6
printf("a[1][2] = *(a[1] + 2) = *(*(a+1) + 2) = %d\n", *(*(a + 1) + 2)); // 結果為:6
cout << *(a + 1) << endl; // 随機記憶體位址 00CFFEB0
cout << a << endl; // 随機記憶體位址 00CFFEA4
cout << *a << endl; // 随機記憶體位址 00CFFEA4
return 0;
}
int a[3][4]
a 類型是:int()[4],a指向首位址,也指向a[0]
&a 類型是:int()[3][4], &a指向整個數組
a[0] 類型是:int*,a[0]指向一維數組的元素
a[0][0] 類型是:int,a[0][0]是一個元素,他的類型就是int類型
指針數組: int*[]
數組指針: int(*)[]
請相信自己當我們迷茫,懶惰,退縮的時候
我們會格外的相信命運
相信一切都是命中注定
而當我們努力拼搏,積極向上時
我們會格外的相信自己
是以命運是什麼呢?
它是如果你習慣它
那它就會一直左右你
如果你想掙脫它
那它就成為你的阻礙
可如果你打破了它
那它就是你人生的墊腳石!
如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,部落客在此感謝!