一、指针的定义
什么是指针?
- 指针就是地址,是内存单元的编号。
- 通常说的指针,指的是指针变量,即用来存放地址的变量。
指针变量:通过&取出变量的内存地址,把地址放到一个变量中,这个变量就是指针变量。
辨识: - 一个地址编号,管理一个字节内存。
- 32位机器有32根地址线,可以产生2^32 个地址,1个地址管理1个字节内存,即管理4GB内存。
- 64位机器有64根地址线,可以产生2^64 个地址。
- 指针在32位平台上大小是4字节,在64位平台上是8字节。
二、指针的类型
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
指针定义的方式是:type + *
,即存放type类型变量的地址。
(一)指针加减整数
printf("%d\n",*(pi+1));
打印的是2;printf("%d\n",*(pc+1));
打印的是0;
注意:指针的类型决定了指针向前或者向后走一步的距离,即跳过几个字节,int类型跳过4个字节,char类型跳过1个字节。
(二)指针的解引用
注意:指针的类型决定了指针解引用时,能够操作的字节数。
(三)野指针
野指针定义:野指针就是指针指向的位置是不可知的。
如何规避野指针:
- 指针初始化(不知道明确指向哪,就初始化为NULL,知道明确指向哪,就取地址)
- 小心指针越界
- 指针指向的空间释放,即置为NULL
- 避免返回局部变量的地址,例如函数中的变量地址,出函数就销毁,返回其变量地址就会产生野指针
- 指针使用之前检查有效性
三、指针的运算
(一)指针±整数
指针的类型决定了指针+整数或-整数的距离,即跳过几个字节,例如int类型跳过4个字节,char类型跳过1个字节。
(二)指针-指针
int my_strlen(char* p)
{
char* s = p;
while (*s != '\0')
{
s++;
}
return s - p;
}
int main()
{
char arr[] = "abcdef";
printf("%d", my_strlen(arr));
}
前提:两个指针指向同一个区域并且类型相同。
指针-指针求得指针与指针之间的元素个数。
(三)指针的关系运算
在遍历数组时,允许指向数组的元素的指针和指向数组最后一个元素后面的内存位置的指针比较,但是不允许与指向第一个元素前面的内存位置的指针比较,即用指针遍历数组,一般是从前往后遍历。
四、指针与数组
- 数组名表示的是数组首元素的地址。
- arr和&arr[0]表示的都是数组首元素的地址。
- &arr表示数组的地址,值和首元素地址相同,类型却不一样。
- sizeof(arr)计算的是整个数组的大小。
五、二级指针
二级指针定义:指针变量也是变量,是变量就有地址,指针的大小在32位系统下的大小是4个字节,管理这4个字节的地址就是二级指针(地址的地址)。
int a = 30;
int *p = &a; \\*代表这个变量是指针,int代表指向的类型int
int **p = &p; \\后*代表这个变量是指针,int*代表指向的类型为int*指针