1、什么是指针?
指针就一个能够根据一个地址值,找到对应的存储空间,然后进行取值或赋值。
2、指针分直接引用和间接引用。
直接引用就是直接通过变量名来读写变量。
间接引用就是先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a。
|
变量 |
地址 |
存放的内容 |
|
a |
ffc1 |
|
|
b |
ffc2 |
ffc1 |
3、指针变量:用来存放变量地址的变量。
如 char *p;char a;
p=&a;//让指针变量p指向a,就是把a的内存地址赋给指针变量p,这*p就能访问变量a的存储空间了。
上面那两句可以简写成 char *p =&a;
4、在同一个编译器环境下,一个指针变量所占的内存空间是固定的。它不会因为指向的类型不同而在内存中所占的空间大小也不同。但在不同的编译器下所占的内存空间是不一样的。
|
指针变量 |
16位编译器 |
32位编译器 |
64位编译器 |
|
void *(指针变量) |
2字节 |
4字节 |
8字节 |
|
char |
1字节 |
1字节 |
1字节 |
5、指针变量所占的内存大小都一样,指针为什么还要分类型?
因为char型指针占1个字节,其他类型的指针占两个字节,所以要分类一下,不然会出现值不对应的事情。如:
#include<stdio.h>
void main(){
int i =2;
char c =1;
char *p =&c;//这样输出是正确的
int *p =&c;//这样输出是错误的,因为int指针是占两个字节的,所以会认为变量c也是,这样就会造成输出结果不正确。
printf(“c的值为%d”,*p);
}
6、指针与一维数组
int a[5];
int *p;
//让指针指向数组的第0个元素
p = &a;
//或者
p = &a[0];
说明:p是指针,a是一个数组。如果p指向了一个数组元素,则p+1表示指向数组该元素的下一个元素。比如,假设p = &a[0],则p+1表示a[1]的地址。对于不同类型的数组元素,p值的改变是不同的。如果数组元素为int类型,p+1代表着p的值加上2(16位编译器环境下)。
7、空指针
没有存储任何内存地址的指针就称为空指针。
空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0。
如:Student *s1 = NULL;
Student *s2 = nil;
8、野指针:不是NULL指针,是指向垃圾内存即不可以用内存的指针。
9、函数指针
一般形式:一般形式:函数的返回值类型 (*指针变量名)(形式参数1, 形式参数2, ...);
注意:形式参数的变量名可以省略,甚至整个形式参数列表都可以省略,指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的。
#include <stdio.h>
int sum(int a, int b) {
return a + b;
}
int main()
{
// 定义一个指针变量p,指向sum函数
int (*p)(int a, int b) = sum;
// 或者 int (*p)(int, int) = sum;
// 或者 int (*p)() = sum;
// 利用指针变量p调用函数
int result = (*p)(1, 3);
// 或者 int result = p(1, 3);
printf("%d", result);
return 0;
}
指向函数的指针变量主要有两个用途:
(1)调用函数
(2)将函数作为参数在函数间传递。
本文详细解释了指针的概念、分类、使用方法及其与其他数据结构的关系,包括直接引用、间接引用、指针变量的作用、空指针与野指针的区别,以及指针与数组、函数指针的应用。通过实例演示了如何正确地使用指针,避免常见陷阱,提高编程效率。
1636

被折叠的 条评论
为什么被折叠?



