【C/C++】指针
目录
1.指针变量
1.1 内存和地址
指针就是用来访问内存
内存:房间
地址:门牌号
内存单元的编号=地址=指针
1.2 指针变量的定义与使用
指针变量也是一种变量,这种变量是用来存放地址的,存放在指针变量中的值都会理解为地址
(在指针变量的眼里,什么都是地址)
*在说明pa为指针变量,int说明pa指向的对象a是int类型的

如果是字符类型呢?
char ch='w';
char *pc=&ch;
#include<iostream> using namespace std; int main() { //1. 指针的定义:数据类型* 变量名 int a = 10; int* p; //给指针变量赋值 p = &a;//指针指向a的地址 cout << p << endl; cout << &a << endl; //2. 指针的使用 cout << "* p =" << *p << endl; cout << "a = " << a << endl; return 0; }
记住!
p = &a
* p = a
* p = * &a = a,*和&抵消
1.3 指针运算
指针类型决定了指针进行+1或-1时,一次走远的距离
int*+1,走4个字节(整形的大小)
char*+1,走1个字节(字符的大小)
void* 无具体类型的指针
不是固定的某一类型的地址,就用void*
2. 指针所占用内存空间
- 32位平台下地址是32个bit位,指针变量大小是4个字节
- 64位平台下地址是64个bit位,指针变量大小是8个字节
- 指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的
×86:

×64:

#include<iostream> using namespace std; int main() { cout << sizeof(int*) << endl; cout << sizeof(float*) << endl; cout << sizeof(double*) << endl; cout << sizeof(char*) << endl; return 0; }3.空指针、野指针
空指针和野指针都不是我们申请的空间,引出不要访问
3.1 空指针
- 空指针是不可以进行访问的
空指针用于给指针变量初始化

3.2 野指针

4.const修饰指针
实验一下:
#include<iostream> using namespace std; int main() { int a = 10; int b = 20; //const修饰指针,指针指向可以改,指针指向的值不可以改 const int* p1 = &a; p1 = &b; //*p1 = 100;//报错 //const修饰常量,指针的指向不可以改,指针的值可以改 int* const p2 = &a; //p2 = &b;//报错 *p2 = 100; //const修饰指针和常量, const int* const p3 = &a; //p3 = &b;//报错 //*p3 = 100;//报错 return 0; }C中const修饰的仍是变量,C++中const修饰的变量是常量
以下三张图中红色为不可修改,黑色为可修改
4.1 const修饰指针

const放在*左边,限制的是:指针指向的内容,不能通过指针来修改指向的内容,但是可以修改指针变量本身的值(修改的指针变量的指向)

4.2 const修饰常量

const放在*右边,限制的是:指针变量本身,指针变量不能再指向其他变量了,但是可以通过修改指针变量修改指针变量指向的内容

4.3 const修饰指针和常量


5.指针和数组
5.1 区分指针数组和数组指针
注意区分指针数组,指针数组是数组,数组指针是指针
字符指针:char*,存放字符的地址
整形指针:int*,存放整形的地址
数组指针:存放数组的地址,指向数组的指针
请思考下面代码的意义?
int* p1[10];
int(*p2)[10];
p1是指针数组,存放指针的数组
p2是指针变量,指向的是数组
5.2 利用指针访问数组元素
访问arr默认就是数组首元素地址

利用for循环逐个访问数组元素

6. 指针和函数
要点:
- 值传递不会改变实参
- 地址传递会改变实参
值传递

地址传递

#include<iostream> using namespace std; void swap1(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; int b = 20; swap1(a, b); //swap2(&a, &b); cout << "a=" << a << endl; cout << "b=" << b << endl; return 0; } 7. 结构体指针
结构体,结构体指针https://blog.ZEEKLOG.net/2301_76153977/article/details/150353517?spm=1001.2014.3001.5501