1.操作符
1)&取地址
另外一个& 按位与,区别好两者。&按位与是双操作数,两边都有操作数,而地址是单操作数
2)*解引用 间接访问操作符
int main() {
int a = 7;
printf("%p\n",&a);//& 取地址
int* pa = &a;//pa用来存放地址 pa:指针变量
*pa = 6;//*解引用 间接访问操作符 将a的值进行改变
printf("%d\n",a); //输出*pa也一样的
}
2.指针类型的意义
1)指针类型决定了指针解引用的权限有多大
它无关的地址是怎么样的,跟你指针变量的类型有关
2)指针类型决定了,指针每走一步,能走多远(步长)
先看int类型
char类型,后面其余都不会变了
补充:对于类型相同的两个指针变量可以进行小于<、等于=、减法运算,不能进行加法运算
注意:我下面是指针跟整数
指针跟指针相减:得到两个指针之间的元素个数
前提:两个指针要在同一块空间,例如一个数组里面的元素
那么我们就可以利用此,算出字符串长度。
int strleng(char* str) {
char* start = str;
while (*str != '\0')
{
str++;
}
return str-start;
}
3.野指针
1)未初始化
2)指针越界访问
C语言自身不检查数据是否越界,所以最好判断地址是否为空
int main() {
int a = 0;
int* p = &a;
if (p != NULL)
{
*p = 10;
}
return 0;
}
4.数组跟指针变量命名
arr[2] == *(arr+2) == *(p+2) == *(2+p) == *(2+arr) == 2[arr]
5.二级指针
int = 10;
int *pa = &a;
int * *ppa = &pa;//pa也是个变量,&pa取了pa在内存中的起始地址
第一个*是pa的数据类型,第二个*是表明ppa是个指针