2021-08-15 C++指针相关

本文详细介绍了C++中的指针概念,包括如何通过指针保存地址、使用&和*操作符、空指针与野指针的区别,以及const修饰指针的各种情况。此外,还探讨了指针在函数参数传递中的作用,如值传递与地址传递的差异,并展示了如何使用指针对数组进行操作,如冒泡排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针

  • 通过一个指针来保存一个地址。
    & 取指操作符。 &a 取a的指针
    *取值操作符, *p 取 指针p 的值
    *p 即 变量a
  int *p ;
  p = &a ;   //指针指向变量a的地址int *p=&a ;
  • 数据类型为 int * 型 ,所以 p 也为 int * 型。
    32位操作系统下,指针的数据类型: int* ,float* ,double * ,char * ,都为4个字节。
    64位操作系统下,指针的数据类型占 8 个字节大小。

  • 空指针
    指针变量指向内存中编号为 0 的空间(该空间不能被访问,0~255的内存编号被系统占用了,不可访问)
    用于初始化指针变量
    int *p = NULL ;

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

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

是不可用的 ,报错!
空指针、野指针都不是自己申请的空间,所以访问都会出错。

  • const修饰指针(常量指针)
    即 形式上
  int a = 1;
  int b = 1;
  const int* p =&a ;   // 常量指针

特点: 指针的指向可以修改,但是指针指向的值不可以修改。
所以 p= &b; 可行, 指向可以修改。
所以 * p = 2 ; 是错误的 ,值不可修改。 (const限定了 * p)

  • const修饰常量(指针常量)
int* const p = &a ;

特点: 指针的指向不可以改,指针指向的值可以改
p = &b ; 错误的,指向不能更改 (const限定了 p)
*p =2 ; 可行,指向的值可以改

  • const修饰指针,const修饰常量
 const int* const p = &a ;

特点: 指针的指向 和 指针指向的值 都不可以改

  • 指针和函数
    值传递不改变值,但是地址传递改变值
void swap1(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	
}
void swap2(int *a,int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
	
}
int main()
{
	int a = 1;
	int b = 2;
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	swap1(a, b);
	cout << "swap1a=" << a << endl;
	cout << "swap1b=" << b << endl;
	swap2(&a, &b);
	cout << "swap2a=" << a << endl;
	cout << "swap2b=" << b << endl;

在这里插入图片描述

  • 将数组传进函数里
    把首地址传进来可以用int* arr接收
void bubbleSort(int* arr, int len)   //冒泡排序
{
	for (int i = 0; i < len -1 ; i++)
	{
		for (int j = 0; j < len - 1 - i; 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]<<" " ;
	}
	cout << endl;
}
int main()
{
	int arr[] = {2,7,9,3,10,6,8,1,4,5};
	int len = sizeof(arr) / sizeof(int);  //得出数组长度用于函数
	bubbleSort( arr,len );
	PrintArray(arr ,len);
	
	system("pause");
	return 0;
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值