天天看點

C++基礎_指針

記憶體四區

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這個變量:

  1. 使用變量名,
  2. 指針通路:指針變量。取值運算符,傳回某一個位址中的值,單目運算符 右到左

    注意了:再定義指針變量的時候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個位元組
}
           

一維數組與指針

  1. 定義一個一維數組,數組名是這個數組的“首位址”
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];(數組的指針)

  1. 通路數組的元素:

    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. 首位址就是一段記憶體中第一個存儲單元的位址

二/多元數組與指針

需要知道:三維數組的存儲單元是一個二維數組,二維數組的存儲單元是一個一維數組,一維數組的存儲單元是一個元素

C++基礎_指針

int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

  1. 數組名a是這個二維數組的首位址,這個數組在記憶體中的第一個存儲單元是a[0],即這個一維數組

    a的類型是:(數組的指針)int(*)[4]; 是以a+1 偏移16位元組

  2. 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類型

C++基礎_指針

指針數組: int*[]

數組指針: int(*)[]

請相信自己

當我們迷茫,懶惰,退縮的時候

我們會格外的相信命運

相信一切都是命中注定

而當我們努力拼搏,積極向上時

我們會格外的相信自己

是以命運是什麼呢?

它是如果你習慣它

那它就會一直左右你

如果你想掙脫它

那它就成為你的阻礙

可如果你打破了它

那它就是你人生的墊腳石!

如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,部落客在此感謝!

c++

繼續閱讀