0%

c++指针

c++指针学习

为何学习指针呢?qwq因为用结构体实现的链表需要指针(看不懂)。

1、何为指针

指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。

2、内存数据的规律

1.计算机中所有数据都是以二进制储存的。
2.数据类型决定了占用内存的大小
3.占据内存的地址就是地址值最小的那个字节的地址 如数组a[10],则数组a的地址为a[0]的地址。

3、指针变量

指针变量就是用来保存指针的对象,我一般理解为保存地址。
如果说指针变量p保存了变量a的地址,我们称p指向了变量a。
我认为指针变量本身也是变量,所有指针变量的地址也可以被指向。

4、创造指针变量

1
2
T *p[10];
T 为类型(int,double,struct等);

5、获取对象地址

指针保存地址,要想获得地址,需要取地址符(&)。

1
2
3
4
5
6
7
8
9
10
11
12
13
int add(int a,int b);

int a = 5,b[10];

int *p = &a;

int *z = b;z指向b[0];

int (*m)[10] = &b;

int(*n)(int,int) = add;

const char *l = "hello world";

我们发现&有时用,有时不用。
小结:
1.数组名的值就是首个元素的值(数组在内存中连续储存)。
2.函数名的地址就是这个函数的地址。
3.字符串字面值常量作为右值时,就是这个字符串对应的字符数组的名称,也就是字符串的地址 。

6、解析地址对象

如果指针指向了一个地址,则允许使用接应用符(*)来访问对象,如下:

1
2
3
4
5
6
7
int age = 19;

int *p_age = &age;

*p_age = 20;//通过指针修改指向的内存数据

printf("%d",*p_age)//通过指针读取

对于结构体和类 则使用->符号访问内部成员:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct Student

{

char name[31];

int age;

float score;

};

int main(void)

{

Student stu = {"Bob" , 19, 98.0};

Student* p_s = &stu;

p_s->age = 20;

p_s->score = 99.0;

printf("name:%s age:%d\n",p_s->name,p_s->age);

return 0;

}

7、指针的状态

指针的值(地址)总会是下列四种状态之一:
1.指向一个对象的地址
2.指向紧邻对象的下一个空间 用于迭代器和指针的运算 如end()就不是指向最后一个元素而是最后一个元素的下一个
3.空指针 NULL(0)
4.无效指针(野指针) 不是很懂搜到的记录一下
无效指针:指针变量的值是NULL,或者未知的地址值,或者是当前应用程序不可访问的地址值,这样的指针就是无效指针,不能对他们做解指针操作,否则程序会出现运行时错误,导致程序意外终止。
任何一个指针变量在做解地址操作前,都必须保证它指向的是有效的,可用的内存块,否则就会出错。坏指针是造成C语言Bug的最频繁的原因之一。
未经初始化的指针就是个无效指针,所以在定义指针变量的时候一定要进行初始化。如果实在是不知道指针的指向,则使用nullptr或NULL进行赋值。

8、指针之间的赋值

1
2
int *p = &a;
int *p1 = p;

p与p1地址不同但指向的内存地址相同。

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道