一、指针概念
1、指针:内存区的每个字节都有一个编号,这个编号就是内存地址,也就是我们说的指针
2、指针变量:指针变量是存放地址的变量
3、指针也是一种数据类型
int * p;p是变量,int*是数据类型
4、万能指针:void * 可以指向任意类型指针
5、指针步长:void *步长无法确定,所以需要转换,int *步长为4,char *步长为1
6、const:修饰指针,表示该指针是只读状态,不能修改
二、实例应用
#include <stdio.h> int * p; int a = 11; int main() { p = &a; printf("a的内存地址:%p\n", p); printf("a的值:%d\n", *p); *p = 22; //相当于给a赋值 printf("a的值:%d\n", *p); system("pause"); return 0; }
&:取a的内存地址
*:取内存地址的值
三、野指针和空指针
1、只有定义后的变量,变量地址才是合法的地址
2、直接指定一个地址都是不合法的,这些不合法的地址就是野指针
3、操作野指针会引起各种报错
int *p=0x1234;
4、空指针:int *p=NULL,为了防止野指针的出现
四、指针大小,32位编译器为4,,64位编译器为8
#include <stdio.h> int main() { int a = sizeof(int *); int b = sizeof(double*); char* p; int c = sizeof(p); printf("int *的大小为:%d\n", a); printf("double *的大小为:%d\n", b); printf("char *的大小为:%d\n", c); system("pause"); return 0; }
五、多级指针
int a=1; int *p=&a; //p存放着a地址 int **q=&p;//q存放着p的地址 int ***r=&q;//r存放着q的地址 *p=*(p+0)=p[0]
六、指针函数
int *fun(); 返回值是指针类型,返回的是全局变量的地址,如果返回局部变量地址会报错,函数执行完,局部变量会释放
#include <stdio.h> int a; int* fun() { return &a; } int main() { int* p = NULL; p = fun(); *p = 1; printf("a=%d\n", *p); system("pause"); return 0; }
运行结果:a=1