大话指针

指针入门,看这个就够了

本文章主要以代码给大家讲解指针是什么,我们该怎么用,以及要注意什么。我不会明确的告诉你们,什么是指针,指针的意义是什么,你们要做的就是把下面的一个个main函数都去实现并运行一遍,体会每一个输出与定义的意义。

1
2
3
4
5
6
7
8
9
10
11
12
void main() {
int num = 100;
int *p = #
//p的值是一个地址,存放的是num的地址
//*p的本质:根据一个地址,获取内容
*p = 10;
//(int *)指针,包含一个地址,这里就是p
//*p就是一个int型的数据

printf(“%d”, change_1(num));
printf(“%d”, change_2(&num));
}
1
2
3
4
5
6
7
8
void main() {

int a = 1;
int *p = &a;
printf(“*p = %d, a = %d”, *p, a);
printf(“\np = %x, &a = %x”, p, &a);

}
1
2
3
4
5
6
7
8
9
10
11
void main() {
int a = 1;
int *p = &a; //&a是一个地址;p存放地址,是一个指针变量
int **pp = &p; //**pp可以当做int理解
**pp = 2;
//**pp == *(*pp)
printf(“%d”, a);
int b = 3;
*pp = &b; //*pp是个int型的指针
printf(“%d”, b);
}

指针的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void main() {
int *p1;
char *p2;
double *pe;
//所有指针在32位系统下都是4个字节
//在64为系统下都是8个字节

//但是地址不能乱传,因为这个地址存储的内容你不知道,它可能是变量,可能是数组,可能是函数
//指针类型的作用:解析这段地址的数据
printf(“%d %d %d”, sizeof(p1), sizeof(p2), sizeof(p3));
}

void main() {
//指针类型不匹配不能乱传
int a = 5555;
int *p = &a;
char *ppp = &a;
char *pp = p;
printf("%d", *pp);
printf("\n%d", *ppp);
printf("\n%d %d", sizeof(*p), sizeof(*pp));
printf("\n%d %d", sizeof(p), sizeof(pp));
}

指针常识

1.指针变量在使用前必须初始化

这里可以访问我的另一篇博客,其详细介绍了指针初始化的含义与注意事项

http://www.saberismywife.com/2016/09/17/指针的初始化/

2.使用二级指针的场景:外部函数改动一级指针必须使用二级指针

3.直接访问:按变量地址来访问变量

间接访问:通过存放变量地址的变量去访问变量

4.空指针

空指针的定义:指针变量值为0

空指针的表示:int p = 0; 或 int p = NULL;

p指向地址为0的单元,系统保证该单元不作它用,表示指针变量值没有意义

p = NULL; 与未对p赋值不同

空指针的用途:

1
2
避免指针变量的非法引用;
在程序中常作为状态比较;

函数改变外部指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
char a = ‘A’;
char b = ‘B’;
void change_1(char *p) {
p = &b;
}
//改变一个变量,需要改变这个变量的地址
//如果变量是数据,就需要指针保存变量的地址
//如果是个指针,就需要二级指open针保存指针变量的地址
void change_2(char **p) {
*p = &b; //*p 对应char *
//**p = ‘c’; //**p对应char
}
int main() {
char *p = &a;
printf(“%c”, *p);
change_1(p);
printf(“%c”, *p);
change_2(&p);
printf(“%c”, *p);
return 0;
}

实战:单向赋值与双向赋值

1
2
3
4
5
6
7
8
9
10
void change_1(int p) {
//单向传递,复制,只能接受不能改变原来的值
p = 100;
}
void change_2(int *p) {
//新建了一个变量,复制了地址的值
//创建一个指针,接受a的地址
//根据地址改变原来的值,通过*(地址)来赋值
*p = 100;
}