1.了解只指针的应用
(1)&用于取变量的地址,然后存入指针变量
如:
int a = 1;
int *p = NULL;//无指向是指向NULL,防止野指针、
p = &a;
(2)*,解引用操作符,用于获取指针指向地址的值,还可以间接改变对应地址的值
如:
int a = 1;
int *p = &a;
printf("%d",*p);
*p = 2;
printf("%d",a);
2.指针类型
(1)char *类,存放字符
(2)int * 类,存放整型
(3)float * ,存放浮点
......
任意指针类型变量在32位下为4字节,在64位下为8字节
区别在与,各个类型的可操作字符可能不一样,如int* float* long*解引用依次可操作4个字节,char* 类型 1个字节,short* 2个字节,double* 8 个字节
3.指针加减整数
根据类型的不同,加减整数跳过的体质为 n(加减的整数)*sizeof(char/int/double);
char* p的指针,执p+1,则跳过1个字节
如:
int n = 10;
int* p1 = &n;
char* p2 = &n;
printf("%p\n",&n);
printf("%p\n",p1);
printf("%p\n",p1+1);
printf("%p\n",p2);
printf("%p\n",p2+1);
4.void* 指针
void *为无返回型指针,此类指针不能进行相加减或者解引用,void的作用为接受任意类型的地址,后期如果需要调用的话需要强制性类型转换
5.const修饰指针
如对于这样一个指针
int a = 10;
int *p = &a;
进行
int const*p = &n;//const修饰的指针指向的内容,保证指针指向的内容不会被改变
//则
*p = 20;//不ok
//但
int m = 2;
p = &m;//ok
进行
int *constp = &n;//const在*的右边,则const修饰的是指针变量p本身,则指针变量的内容不能被改变
但指针指向的内容可以被改变
p = &m;//不ok
*p = 20;//ok
总结:当const在*右边时,修饰指针变量本身,该指针变量不能再指向别的变量的地址,但当前指向的地址的值是可以改变的
当const在*左边时,修饰的是指向地址的值,该值不可被改变,但该指针可以指向别的变量的地址
6.指针运算
(1)指针加减整数(上已述)
(2)指针-指针
结果为两个指针之间的元素个数
如:88
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a[9] = { 0 };
printf("%d", &a[8] - &a[0]);
}
结果为8
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8];
^ ^
黄色所指为之间元素
(3)指针之间可以比大小
int a[] = { 1,2,3 };
int* p = a;
int sz = sizeof(a) / sizeof(a[0]);
while (p < a + sz)
{
printf("%d ", *p);
p++;
}
return 0;
7.野指针
由于位置位置,故不可用,应尽量避免
野指针成因
(1)指针未初始化
int *p = NULL;
(2)指针越界访问
如:
int a[3] = { 0 };
int* p = a;
for (int i = 0; i <= 3; i++)
{
printf("%d", *(p + i));
}
return 0;
数组中无a[3],当指针p指向a[3]时,造成指针月结访问,要报错
(3)指针指向的空间被释放
8.assert断言
使用方法,assert( 。。。。。。)在assert括号内若执行不下去,系统自动报错,可以用来检测指针是否为空指针