目录
指针是什么
指针说白了就是变量,它是用来存放地址的。
int main()
{
int a = 10;
int *pa = &a;
char c = 'w';
char* pc = &c;
return 0;
}
指针的大小在32位平台是4个字节,在64位平台是8个字节。
指针类型
指针其实也是有类型的,指针类型决定了指针向前或者向后走一步有多大距离。
int main()
{
int a = 0x11223344;
//int *pa = &a;
//*pa = 0;
char *pc = &a;//可以放进去
*pc = 0;//并不是4个字节全部变成0,只有一个字节变成了0
//指针类型决定了指针解引用操作的时候,一次访问几个字节(访问内存的大小)
//char* 指针解引用访问1个字节
//int* 指针解引用访问4个字节
return 0;
}
char* 指针解引用访问1个字节,int* 指针解引用访问4个字节 。
int main()
{
int a = 10;
int *pa = &a;
char *pc = &a;
printf("%p\n", pa);
printf("%p\n", pc);
printf("%p\n", pa+1);
printf("%p\n", pc+1);
//说明指针类型决定了,指针+-整数的时候步长
//int* +1跳过4个字节
//char* +1跳过1个字节
return 0;
}
上面例子总说明了指针类型决定指针+-的步长。
野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。
造成野指针的原因:
1.指针没有初始化
2.直接越界访问
int main()
{
//int *p;//没有初始化里面存放的随机值
//*p = 20;//通过p中存的随机值作为地址,找到一个空间,这个空间不属于我们当前程序,造成了非法访问
//指针越界,造成野指针
int arr[10] = { 0 };
int i = 0;
int * p = arr;
for (i = 0; i <= 10; i++)
{
*p = i;
p++;
}
return 0;
}
规避野指针的方法:
1.指针初始化
2.小心指针越界
3.指针指向空间释放即使置NULL
4.指针使用前要检测有效性
指针运算
1.指针+-整数
int main()
{
int *p = &arr[9];
printf("%p\n", p);
printf("%p\n", p - 1);// 指针 + -整数
return 0;
}
2.指针-指针
指针 - 指针得到数字的绝对值是指针与指针之间元素的个数
指针-指针的前提是两个指针指向同一块区域
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
printf("%d\n", &arr[9] - &arr[0]);//指针-指针 9
printf("%d\n", &arr[0] - &arr[9]);//-9
//指针 - 指针得到数字的绝对值是指针与指针之间元素的个数
//指针-指针的前提是两个指针指向同一块区域
}
求字符串长度:
//int my_strlen(char* s)
//{
// int count = 0;
// while (*s != '\0')
// {
// count++;
// s++;
// }
// return count;
//}
int my_strlen(char* s)
{
int count = 0;
char *start = s;
while (*s != '\0')
{
s++;
}
return s-start;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
指针和数组
数组名表示首元素的地址,所以可以用指针来接收。
int main()
{
int arr[10] = {0};
int *p = arr;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
*(p + i) = i;
}
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
二级指针
指针变量也是变量,是变量就有地址,所以地址存放在二级指针里面。
int main()
{
int a = 10;
int *p = &a;//一级指针
int **pp = &p;//pp就是二级指针
**pp = 20;
printf("%d\n", a);//20
//int ***ppp = &pp;//ppp就是三级指针
return 0;
}
指针数组
指针数组其实是数组,它是用来存放指针的数组。
int main()
{
int arr[10];//整形数组
char ch[5];//字符数组
//指针数组--存放指针的数组
//int* 整形指针数组
//char* 字符指针数组
int* parr[5];
char* pc[6];
return 0;
}
举例:
int main()
{
int a = 10;
int b = 20;
int c = 30;
//int *pa = &a;
//int *pb = &b;
//int *pc = &c;
int* arr[3] = { &a, &b, &c };
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d\n",*(arr[i]));
}
return 0;
}