【c++】指针


指针的定义和使用

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

使用指针:
可以通过解引用的方式来找到指针指向的内存;
指针前加*代表解引用,找到指针指向的内存中的数据。

#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	int* p;  //定义指针语法:数据类型 *指针变量名
	p = &a;  //指针指向变量a的地址,&a表示取a的地址
	//int* p = &a;等价于上面两行
	cout << a << endl;
	cout << p << endl;

	*p = 100;  //通过*操作指针指向变量的内存,*p表示取a的值
	cout << a << endl;
	cout << *p << endl;

	system("pause");
	return 0;
}

输出:
10
00FDFEA0
100
100

指针所占的内存空间

指针也是一种数据类型。
在32位操作系统下,指针是占4个字节空间大小,不管什么数据类型;
在64位操作系统下,指针是占8个字节空间大小,不管什么数据类型;

空指针

空指针:指针变量指向内存中编号为0的空间。
用途:初始化指针变量。
注意:空指针指向的内存是不可以访问的。

int* p = NULL;  //空指针用于给指针变量进行初始化

//空指针是不可以进行访问的
//0~255之间的内存编号是系统占用的,因此不可以访问
cout << *p << endl;  //编译失败
*p = 100;  //编译失败

野指针

野指针:指针变量指向非法的内存空间。

野指针的成因:
1、指针未初始化:
指针变量刚被创建时不会自动成为NULL指针,它所指向的空间是随机的;
2、指针越界访问:指针指向的范围超出了合理范围,或者调用函数时返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放;
3、指针释放后未置空:释放后的指针应立即将指针置为NULL,防止产生“野指针”。

const修饰指针

1、const修饰指针——常量指针
指针指向的值不可以改;
指针的指向可以改。

const int* p1=&a;
p1=&b;//正确
*p1=100;//错误

2、const修饰常量——指针常量
特点:
指针的指向不可以改;
指针指向的值可以改。

int* const p2=&a;
p2=&b;//错误
*p2=100;//正确

3、const修饰指针和常量
指针的指向和指向的值都不可以该。

const int* const p3=&a;
p3=&b;//错误
*p3=100;//错误

指针和数组

作用:利用指针访问数组中的元素。

int main()
{
	int arr[] = { 1,2,3,4,5 };
	int* p = arr;//指向数组的指针,arr就是数组首地址
	cout << "利用指针访问第一个元素:" << *p << endl;
	p++;//让指针向后偏移4个字节(32位操作系统)
	cout << "利用指针访问第二个元素:" << *p << endl;
	cout << "利用指针变量数组:" << endl;
	int* p1 = arr;
	for (int i=0;i<5;i++)
	{
		//利用指针遍历数组
		cout << *p1 << " ";
		p1++;
	}
	system("pause");
	return 0;
}

输出:
利用指针访问第一个元素:1
利用指针访问第二个元素:2
利用指针变量数组:
1 2 3 4 5

指针和函数

例:实现两个数字进行交换

#include<iostream>
using namespace std;

//值传递
void swap0(int num1, int num2)
{
	int temp = num1;
	num1 = num2;
	num2 = temp;
}
//地址传递
void swap(int* p1, int* p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

int main()
{
	int a = 10;
	int b = 20;
	swap(&a, &b);//地址传递会改变实参,而值传递不会改变实参
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

	system("pause");
	return 0;
}

值传递和地址传递的区别:
值传递:只是把实参复制传给形参,在子函数中修改形参,不会改变主函数中的实参;
地址传递:由于形参和实参表示同一个内容,在子函数中修改形参,也会改变主函数中的实参。

指针、数组、函数

案例:冒泡排序

#include<iostream>
using namespace std;

void bubbleSort(int* arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		for (int j = 0; j < len-i-1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

void printArray(int* arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << endl;
	}
}

int main()
{
	int arr[10] = { 9,5,7,3,6,4,8,1,2,0 };
	
	//数组长度
	int len = sizeof(arr) / sizeof(arr[0]);
	//排序
	bubbleSort(arr, len);//arr就表示数组首地址
	//输出
	printArray(arr, len);

	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值