【P56-63 指针】C/C++ 指针(占用、空指针、野指针、指针常量、常量指针、指针和数组)

这篇博客详细介绍了C/C++中的指针概念,包括指针的定义和使用,指针占用的空间,空指针,野指针以及const修饰指针的三种情况。通过示例代码演示了常量指针、指针常量和同时修饰指针及常量的用法,并讨论了指针在数组和函数中的应用。此外,还展示了如何通过指针进行函数参数的值传递和地址传递,以及指针在冒泡排序和数组操作中的作用。
摘要由CSDN通过智能技术生成

指针

1 C/C++ 指针 定义和使用

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;

int main() {
	
	int a;//变量a的地址0x123
	int* b;//变量b的地址0x234

	a = 5;
	b = &a;//把a的地址给b 

	cout << a<<endl;  //5
	cout << &a << endl;  //0x123
	cout << b << endl;//0x123

	cout << *b << endl;//5
	cout << *(&a) << endl;//5
	
}

在这里插入图片描述
数组
在这里插入图片描述

#include <iostream>
using namespace std;

int main() {	
	int* b;

	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	//arr = &arr[0],数组名arr就是数组首元素arr[0]的地址
	b = arr; //首元素地址给b
	b = &arr[0];//首元素地址给b
	cout << *b << endl; //arr[0]
	cout << *(b + 1)<<endl; //arr[1]
}

在这里插入图片描述

2 指针占用空间

//在32位操作系统下:占用4个字节空间,64位下占8个字节。
// 
//32位系统,不管是什么类型指针,都是占用4字节;
//64位系统,不管是什么类型指针,都是占用8字节;

//64位系统,选择x86——都是4个字节,选择x64——都是8个字节
int a = 10;
int* p = &a;

cout << "sizeof(char *)= " << sizeof(char *) << endl;
cout << "sizeof(int *)= " << sizeof(int*) << endl;
cout << "sizeof(float *)= " << sizeof(float*) << endl;
cout << "sizeof(double *)= " << sizeof(double*) << endl;
//64位系统,不管是什么类型指针,都是占用8字节;

在这里插入图片描述

//32位系统,不管是什么类型指针,都是占用4字节;

在这里插入图片描述

3 空指针

在这里插入图片描述

int main() {
	int* p = NULL;
	*p = 100;

	return 0;
}

在这里插入图片描述

在这里插入图片描述

4 野指针

在这里插入图片描述

申请一个指针,随便指定一个内存空间,语法上没问题,编译器检测通过,但是运行出错

int main() {
	int* p = (int *)0x1100;
	cout << *p << endl;

	return 0;
}

在这里插入图片描述

在这里插入图片描述

5 const修饰指针

在这里插入图片描述

技巧:
看const右侧紧跟着的是指针还是常星:
(1)const右侧紧跟指针,就是常量指针;指向可以修改;
(2)const右侧紧跟常量,就是指针常量;数值可修改;

int main() {
	int a = 10;
	int b = 20;

	//1. 常量指针
	//指针指向的值不可以改,指针的指向可以改
	const int * p1 = &a; //同  int const * p1 = &a;
	*p1 = 100; //错误
	p1 = &b;   //正确

	//2.指针常量,
	//指针指向的值可以改,指针的指向不可以改
	int* const p2 = &a;
	*p2 = 100; //正确
	p2 = &b;   //错误

	//3.const既修饰针织,又修饰常量
	//指针指向的值不可以改,指针的指向不可以改
	const int* const p3 = &a;
	*p3 = 100; //错误
	p3 = &b;   //错误

	return 0;
}

5.1 常量指针 const int * p=&a; 同 int const * p1 = &a;

int a=10;
const int * p=&a;

在这里插入图片描述

5.2 指针常量 int * const p=&a;

int a=10;
int *  const p=&a;

在这里插入图片描述

5.3 cons既修饰指针,又修饰常量 const int * const p = &a;

int a= 10;
const int * const p = &a;

在这里插入图片描述

6 指针和数组

在这里插入图片描述
在这里插入图片描述

7 指针和函数

在这里插入图片描述

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 a = 10, b = 20;

    //1.值传递
	swap(a,b);//实参并未改变,形参发生交换
	cout << "sawp  a= " << a <<" sawp  b= "<< b <<  endl;

	//2.地址传递
	swap2(&a, &b);//传递实参的地址,改变实参
	cout << "sawp2 a= " << a << " sawp2 b= " << b << endl;

	return 0;
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7 指针配合数组、函数案例

在这里插入图片描述

//交换(修改实参)
void swap2(int *p1, int *p2) {//用指针接收实参地址,再对地址内容进行和交换
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
//冒泡排序
void bubbleSort(int* arr,int n) {
	for (int i = 0; i < n - 1; i++)
		for (int j = 0; j < n - 1 - i; j++)
			if (arr[j] > arr[j + 1])
				swap2(&arr[j],&arr[j+1]);
}
//打印输出
void print(int* arr,int n) {
	for (int i = 0; i < n; i++) {
		cout << *arr << endl;
		arr++;
	}
}
int main() {
	int a[] = {2,5,8,3,6,9,1,4,7,10};
	bubbleSort(a,10);
	print(a,10);

	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-G-B

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值