指针
指针是什么
指针是个变量,存放内存单元的地址(编号)
可以粗略理解为指针就是地址
int a = 10;
int* p = &a;
在32位的机器上,地址是32个二进制序列,所以地址就要用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节
同理,在64位的机器上,一个指针变量的大小是8个字节
指针和指针类型
我们知道变量有不同的数据类型,那指针有没有呢?
int main()
{
printf("%d\n",sizeof(char*));
printf("%d\n",sizeof(short*));
printf("%d\n",sizeof(int*));
printf("%d\n",sizeof(double*));
return 0;
}
打印后可发现都是4个字节,既然指针大小一样了,为什么还要区分指针类型呢?
int a = 0x11223344;
int* pa = &a;
*pa = 0;
char* pc = &a;
*pc = 0;
经过内存监视窗口可以知道,两个指针类型不同,会导致解饮用操作的不同
指针类型意义1:
指针类型决定了指针进行解饮用操作的时候,能够访问空间的大小。
int *p: *p能够访问4个字节
char *p:*p能够访问1个字节
double *p:*p能够访问8个字节
指针类型意义2:
指针类型决定了:指针走一步走多远(指针的步长
int* p :p+1—>4
char* p :p+1—>1
double* p:p---->8
野指针
野指针就是指针指向的位置是不可知的
野指针的成因
- 未初始化
- 越界访问
- 指针指向的空间释放
int a;//局部变量不初始化,默认是随机值
int* p;//局部的指针变量,就被初始化随机值
*p = 20;
如何避免野指针
指针运算
-
指针±整数
-
指针-指针
结果是9,所以指针减去指针得到的指针和指针之间的元素个数
int my_strlen(char* str)
{
char* start = str;
char* end = str;
while(*end != '\0')
{
end++;
}
return end - start;
}
int main()
{
char arr[]= "welcome";
int len = my_strlen(arr);
printf("%d\n",len);
return 0;
}
- 指针的关系运算
其实就是比较大小
指针和数组
要知道数组名是首元素的地址,只有两个例外,即
- &arr-----&数组名—此时的数据名不是首元素的地址,而是表示整个数组-----&数组名取出的是整个数组的地址
- sizeof(arr)----sizeof(数组名)表示的是整个数组----sizeof(数组名)计算的是整个数组的大小,单位是字节
输出发现值一样
二级指针
int a = 10;
int* pa = &a;
int* * ppa = &pa;//ppa就是二级指针
指针数组
存放指针的数组
int a = 10;
int b = 20;
int c = 30;
int* arr2[3]={&a,&b,&c};//指针数组
int i = 0;
for(i = 0;i<3;i++)
{
printf("%d",*(arr2[i]));
}