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)将函数作为参数在函数间传递。