1.1指针的基本概念

指针的作用:通过指针简介访问内存

  • 内存编号一般从0开始,一般用十六进制表示
  • 可以利用指针变量保存地址

指针变量定义语法:数据类型 *变量名;

示例:

#include<iostream>
using namespace std;

int main() {
	int a = 10;
	//定义指针,让指针p指向a的地址
	int* p = &a;//&符号为取址符号
	cout << "p的值为" << p << endl;
	cout << "a的地址为:" << &a << endl;
	
	//使用指针
	//用解引用的方式来找到指针指向的内存
	*p=1000;//指针前加 * 代表解引用,找到指针指向的内存地址中的数据
	//通过*p修改指针指向的内存中的数据
	cout << "a=" << a << endl;
	cout << "*p=" << *p << endl;
	return 0;
}

代码运行逻辑:

1.2指针占用的内存空间

  • 指针也是一种数据类型,所以指针占用的内存大小也可以使用sizeof( )访问.
  • 32位操作系统下,任何类型的指针都占4字节
#include<iostream>
using namespace std;

int main() {

	int a = 10;
	int* p = &a;
	cout << *p << endl;
	cout << "sizeof(int*)=" << sizeof(p) << endl;//sizeof(int*)和sizeof(p)是一样的
	cout << "sizeof(int*)=" << sizeof(double*) << endl;
	cout << "sizeof(int*)=" << sizeof(char*) << endl;
	cout << "sizeof(int*)=" << sizeof(float*) << endl;


	return 0;
}

1.3空指针和野指针

  • 空指针和野指针都不是我们申请的,所以不要随意访问
#include<iostream>
using namespace std;

int main() {

	//空指针,用来给指针变量进行初始化
	int* p = NULL;
	//空指针不可以访问
//0~255为系统占用内存,不可以访问

	//野指针指向非法的内存空间


	return 0;

}

1.4const修饰指针

1.4.1const修饰指针-常量指针

常量指针 const int*p=&a

 指针的指向可以改变,指针指向的值不可以改变

1.4.2const修饰常量——指针常量

指针常量int*const p=&a

指针的指向不可以改,指着指向的值可以改。

1.4.3const既修饰指针,又修饰常量

const int * const p=&a;

指针的指向和指针指向的值都不可以改变

1.5指针和数组

  • 利用指针访问数组需要先得到数组的首地址:int*p=arr;
#include<iostream>
using namespace std;

int main() {
	int arr[5] = { 3,4,5,6,7 };
	cout << "数组中第一个元素的值:" << arr[0] << endl;
	//利用指针访问第一个元素
	int* p = arr;
	for (int i = 0; i < 5; i++) {
		cout << "数组中第"<<i+1<<"个元素的值:" << *p << endl;
		cout <<  "数组中第" << i + 1 << "个元素的地址:" << p << endl;
		p++;//指针向后偏移4个字节
	}


	return 0;
}

1.6指针和函数

  • 利用指针作为函数参数,可以修改实参的值。
#include<iostream>
using namespace std;
//值传递
void swap(int a, int b){

	int temp = a;
 a = b;
 b = temp;

	}

//地址传递
void swap2(int* p1, int* p2) {
	

	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;

}

int main() {
	int n= 20, m = 30;
	cout << "传递前n=" << n<< endl;
	cout << "传递前m=" << m << endl;
	
	swap(n, m);
	cout << "值传递后n=" << n << endl;
	cout << "值传递后m=" << m << endl;
	
	swap2(&n, &m);
	cout << "地址传递后*p1=" << n << endl;
	cout << "地址传递后*p2=" << m<< endl;
	
	return 0;
}

1.7指针配合数组和函数的案例

#include<iostream>
using namespace std;
void supp(int arr[],int len) {
	for (int i = 0; i < len - 1; i++) {
		for (int j = 0; j < len - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

}

int main() {
	int arr[10] = { 4,3,6,9,1,2,7,8,10,5 };
	int len = sizeof(arr) / sizeof(arr[0]);
	supp(arr, len);
	for (int i = 0; i < len; i++) {
		cout << arr[i] << endl;
	}
		



	return 0;
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐