31天C语言——8,指针基础

1,入门案例

#include <stdio.h>

int main() {
    
    
	int a = 3;
	printf("%d\n", a);
	int *b = &a;
	*b = 7;
	printf("%d\n", a);
	return 0;
}

效果:

在这里插入图片描述
a从3变成了7。

2,图解过程

int a=3
变量a,值是3。
在这里插入图片描述
a
访问变量a
&a
访问a所指向的地址。
在这里插入图片描述

int* b=&a
获取a的地址,存放地址到b中。
在这里插入图片描述

*b
找到b中的值所指向的地址。图中3所在的方框。

在这里插入图片描述
*b=7
找到b中的值所指向的地址,修改数据为7。

在这里插入图片描述

3,指针的类型

指针有很多类型,比如:
int*
char*
double*

访问范围

不同的类型,解引用之后,能访问的字节数不同。

char*:一个字节。
int*:四个字节。
double*:八个字节。

比如:
数据是int类型,
指针是char*类型,
改动的时候只会改变一个字节。

#include <stdio.h>

int main() {
    
    
	int a = 0x11223344;
	printf("%x\n", a);
	char *b = &a;
	*b = 0;
	printf("%x\n", a);
	return 0;
}

效果:只有最低的一个字节被修改了。

在这里插入图片描述

int* 会访问四个字节大小的范围。
char* 只有一个字节。

在这里插入图片描述

偏移

int* b=&a
char* c=&a

指针类型加一。
表示该地址后面的一个地址。

b+1代表a指向的数据向后移动4字节。
c+1代表a指向的数据向后移动1字节。

#include <stdio.h>

int main() {
    
    
	int a = 3;
	int *b = &a;
	char *c = &a;
	printf("%p\n", b);
	printf("%p\n", c);
	printf("%p\n", b + 1);
	printf("%p\n", c + 1);
	return 0;
}

效果:
b+1:地址加4
c+1:地址加1

在这里插入图片描述

4,用偏移操作数组

数组名是对首个元素的指针,
数组名加一就是第二个元素。

举例:让第三个元素的值加123。

#include <stdio.h>

int main() {
    
    
	int arr[] = {
    
    1, 2, 3, 4, 5, 6, 7};
	*(arr + 2) += 123;
	printf("%d\n", arr[2]);
	return 0;
}

效果:3+123=126

在这里插入图片描述

5,野指针

野指针:指针,但是指向奇怪的地方。

野指针会导致大部分的Bug。

常见的几种野指针:

  1. 未初始化的指针。
  2. 数组越界之后的指针。
  3. 数据已经不在生命周期的指针。

猜你喜欢

转载自blog.csdn.net/qq_37284843/article/details/124403350