C++入門到理解階段二基礎篇(8)——C++指針

1.什麼是指針?

         爲了更加清楚的瞭解什麼是指針?咱們首先看下變量和內存的關係,當咱們定義了int a=10以後。至關於在內存之中找了塊4個字節大小的空間,而且存儲10,要想操做這塊空間,就經過a這個變量,實際操做的是這塊內存對應的地址編號,只是這個十六位進制的內存編號咱們不知道,因此使用變量操做。那咱們若是可以知道這塊空間的內存地址編號,咱們也能夠操做這塊空間。那又如何知道這個內存地址編號呢?這裏就要引入指針概念。咱們用指針保存一塊內存的地址編號,換句話能夠理解爲指針就是一個地址。html

2.如何使用指針

首先咱們定義一個指針,格式 數據類型 *指針名;java

int *p;

而後使用地址符&記錄一個變量的地址,好比記錄int a=10;這個變量a的地址,ios

int main() {
	int a = 1;
	int *b;
	b = &a;//使用取址符將地址給指針
	cout << &a;//輸出變量a的地址編號001AFd84
	cout << b;//輸出指針b的值是001AFd84,因此指針就是一個地址
}

上面咱們知道了指針的值,即對應這塊內存的地址編號,那如何操做這塊內存裏面的數據?經過解引用的方式,在指針p前面加個*就是取到這塊內存對應的數據 ,因此上面實例編程

int main() {
	int a = 1;
	int *b;
	b = &a;
	cout << &a;
	cout << b;
	cout << *b;//解引用,獲得指針(地址)對應的數據,1
}

固然,上面int *b; b = &a;兩句代碼能夠用如下代替數組

int main() {
	int a = 1;
	int *b = &a;
	cout << a;//變量a的值爲1
	cout << &a;//變量a的地址爲002AlF48
	cout << b;//指針值爲002AlF48
	cout << *b;//指針對應的數據爲1
}

注意:app

在32位操做系統下,指針佔用4個字節,無論什麼類型的指針,64位下,佔用8個字節。函數

3.空指針

咱們將指向內存地址編號爲0的指針叫作空指針,主要用來初始化指針變量。而且空指針不容許訪問,由於0-255空間是由系統使用的。url

int main() {
	int *b = NULL;
	*b = 100;//程序報錯。不能訪問空指針
}

4.const修飾指針

int main() {
	int a = 10;
	int b = 20;
	//const定義一個常量指針,此時指針能夠修改,可是指針的值不可修改
	const int *c = &a;
	//*c = 20;//指針的值不可修改,錯誤
	c = &b;//指針能夠修改,正確
	//const定義一個指針常量,此時指針的值能夠修改,可是指針不可修改
	int* const d = &a;
	//d = &b;//錯誤
	*d = 20;//正確
	//const修改常量又修飾指針,此時指針的值和指針都不可修改
	const int* const e = &a;
}

總結:const在前就是常量指針,指針在前就是指針常量,const後跟*表示值不可修改,const跟指針名錶示指針不可修改spa

5.指針和數組

int main() {
	int a[3] = {1,2,3};
	int *p = a;//注意數組和變量不同,不是&a,由於數組名就是數組的首地址
	cout << *p;//1
	//如何訪問第二個元素,只需將這個整型的地址向後移4個字節,即p++
	for (int i = 0; i < 3; i++) {
		cout << *p;//1
		p++;
	}
}

 

6.指針和函數

前面咱們討論過如下案例操作系統

#include <iostream>
using namespace std;
void swap(int m1,int m2);
int main() {
	int a = 1;
	int b = 2;
	swap(a, b);
	cout << a;//1
	cout << b;//2
}
//交換
void swap(int a, int b) {
	int temp = b;
	b = a;
	a = temp;
	cout << a;//2
	cout << b;//1
}

對於這種值傳遞不會影響實參,再看地址傳遞

#include <iostream>
using namespace std;
void swap(int *m1,int *m2);
int main() {
	int a = 1;
	int b = 2;
	swap(&a, &b);
	cout << a;//2
	cout << b;//1
}
//交換
void swap(int *a, int *b) {
	int temp = *b;
	*b = *a;
	*a = temp;
	cout << *a;//2
	cout << *b;//1
}

總結:若是想修改實參就用地址傳遞,不想修改實參就用值傳遞,綜合案例冒泡排序

 

                        掃描 關注公衆號 java一號。更重要的是小猿願成爲你編程路上的一個朋友!

文章首發地址: www.javayihao.top

首發公衆號: java一號

相關文章
相關標籤/搜索