一、指针运算
给一个指针变量+1,通常情况下不是给指针本身+1,而是”迈一步“,步长根据指针的类型来确定。
int main() {
char a = 1;
int b = 1;
int arr[10] = { 0 };
char* pa = &a;
int* pb = &b;
int(*parr)[10] = &arr;
printf("%p\n", pa );
printf("%p\n", pa + 1); //相差1
printf("%p\n", pb);
printf("%p\n", pb + 1); //相差4
printf("%p\n", parr);
printf("%p\n", parr + 1); //相差40
return 0;
}
二、字符指针(char*)
char*用于存储char型变量的地址
1.通过字符指针创建常量字符串
以下是三种打印字符串的方式
int main() {
//第一种
char arr[] = "hello world";
printf("%s\n", arr); //arr末尾隐藏\0,打印时读取到\0结束
//第二种
char* p1 = arr;
printf("%s\n", p1);
//第三种
char* p2 = "hello world";
printf("%s\n", p2);
return 0;
}
其中第一二种为常规方式,重点分析第三种 ‘char* p2 = "hello world" ’,看似是把char型数组直接赋值给p2指针,实则不然,
因为char型指针最多存放4个字节,而hello world\0有12个字节。p2实际上是存储了首元素地址。
用第三种方式创建的字符串为常量字符串,无法被修改,最好用const加以修饰
int main() {
char arr1[] = "abcdef";
char arr2[] = "abcdef";
char* p1 = "abcdef";
char* p2 = "abcdef"; //如果两个常量字符串完全相同,则其不会在内存中反复创建,只会创建一个,并且拥有唯一的地址
if (arr1 == arr2) //首元素地址不相同
printf("相等\n");
else
printf("不相等\n");
if (p1 == p2) //首元素地址相同
printf("相等\n");
else
printf("不相等\n");
return 0; //结果为不相等 相等
}