•  值传递:函数调用时实参将数值传入形参。如果形参发生变化,实参不会发生变化。

  

  

  • int* p 和 int *p 意思一样;int* p, q 和 int *p, q 都是定义一个int指针和变量。
  • int* 和 p 都叫指针
  • 在32位系统下,一个指针地址占4个字节;64位系统中占8个字节
  • 空指针指向的内存不可访问,0~255之间的内存为系统占用内存,不允许用户访问
  • 野指针:又称“悬挂指针”,没有明确指向的指针,一般指向不可用的地址。int* p = (int*)0x1100; // 十六进制数强制转换成指针。

        空指针和野指针都不是我们申请的空间,因此不要访问。

  • 常量指针和指针常量
  • 常量指针:const int* p,指针的指向可以改(地址),指针指向的值不可以改
  • 	int a = 10;
    	const int* p;
    	*p = 20; //错误,指针指向的值不可以改
    	p = &a; //正确,指针的指向可以改

         

  • 指针常量:int * const p,指针的指向不可以改,指针指向的值可以改

        

	int a = 10;
	int* const p = &a;
	*p = 20; //错误,指针指向的值不可以改
	p = &a; //正确,指针的指向可以改

         

  • 常量指针常量:const int * const p;

         

常量指针、指针常量、常量指针常量

//定义变量
	int a = 1;
	//定义常量
	const int b = 2;
	// 定义常量指针
	const int* ptr1 = &a;
	//定义指针常量,必须赋值,指向了,不可更改地址
	int* const ptr2 = &a;
	//错误,不能吧常量的地址赋给指针变量
	//“const int *”类型的值不能用于初始化“int *”类型的实体
	int* ptr3 = &b;
	//正确,可以把常量的地址赋给常量指针
	const int* ptr4 = &b;
	//错误,不能把值赋给常量指针,间接引用常量指针不可以修改内存中的数据
	//表达式必须是可修改的左值
	*ptr1 = 3;
	//正确,指针常量可以修改值,不能修改指向的地址
	*ptr2 = 4;
	//正确,常量指针可以修改地址,但不能修改值
	ptr1 = &b;
	//错误,指针常量不能修改地址,可以修改值
	//表达式必须是可修改的左值
	ptr2 = &b;
	//正确,但常量指针常量声明的同时必须定义初始化,定义后不能修改地址和值
	const int* const ptr5 = &a;
	//错误,表达式必须是可修改的左值
	*ptr5 = 5;
	//错误,表达式必须是可修改的左值
	ptr5 = &b;
  • 易记:const 在 int *前,*p表示取值,const 修饰 值 *p,表示不可改值,地址可改;

                    const 在 int *后,p表示指针,const修饰指针 p,表示可以改值,地址不可改。

  • 不能把常量的地址赋给指针变量
  • 地址传递与值传递
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()
{
	//指针和函数
	//1、值传递,形参无法修改实参
	int a = 10;
	int b = 20;
	swap1(a, b);
	cout << "值传递:" << a << " " << b << endl;
	//地址传递
	swap2(&a, &b);
	cout << "地址传递:" << a << " " << b << endl;


	cout << endl;
	return 0;
}