1. const 修饰指针2. 指针运算3. 野指针4. assert断⾔5. 指针的使⽤和传址调⽤
- const修饰指针
1.1使用const修饰变量
x的本质还是变量,因为有const修饰,编译器在语法上不允许修改这个变量。
1.2当const修饰指针
const 放在*的左边:const int * p / int const * p;
/ 意思:表示指针指向的内容,不能通过指针来改变了。但是指针变量本身的值是可以改的。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n = 0;
printf("n = %d\n", n);
//const int * p = &n; int const *p=&n;
/*p = 20;n=20;
printf("n = %d\n", n);
return 0;
}
const 放在*的右边:int * const p;
意思:表示指针变量p本身不可以修改了,但是指针指向的内容是可以通过指针变量来改变的。
#include<stdio.h>
int main()
{
int n = 0;
printf("n = %d\n", n);
int * const p = &n;
// int num = 20;
// p = #
//printf("n = %d\n", num);
*p = 20;
printf("n = %d\n", n);
return 0;
}
当*左右都有const
const int * const p;
意思:指针变量p不能被修改,指针变量p指向的内容也不能被修改。
- 指针运算
指针的基本运算有三种,分别是:
• 指针±整数
• 指针-指针
• 指针的关系运算
2.1指针±整数
指针+整数
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = &arr[0];//*p获取arr数组的首地址
int s = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < s; i++)
{
printf("%d ", *p+i);
}
return 0;
}
指针-整数
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int s = sizeof(arr) / sizeof(arr[0]);
int* p = &arr[s - 1];
for (int i = 0; i <s; i++)
{
printf("%d ", *p-i );
}
return 0;
}
2.2指针-指针
指针之间的运算的前提是两个指针指向同一块空间
不能相加只能相减
指针-指针本质是地址-地址获取的绝对值是指针和指针之间的元素个数。
2.3指针的关系运算
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;//*p获取arr数组的首地址
int s = sizeof(arr) / sizeof(arr[0]);
while (p < &arr[s])
{
printf("%d ", *p);
p++;
}
return 0;
}
3. 野指针
3.1. 指针未初始化
3.2指针的越界
3.3 指针指向的空间释放