指针的进阶目录
1. 字符指针
2. 数组指针
3. 指针数组
4. 数组传参和指针传参
5. 函数指针
6. 函数指针数组
7. 指向函数指针数组的指针
8. 回调函数
9. 指针和数组面试题的解析
指针
1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。
3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候访问的字节个数。
4. 指针的运算。
字符指针
在指针的类型中我们知道有一种指针类型为字符指针 char* ;
一般使用:
int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'w';
return 0;
}
通过指针打印字符串
int main()
{
char arr[]="abcdef";
char* pc=arr;
printf("%s\n",arr);
printf("%s\n",pc);
return 0;
}
/*
结果:
abcdef
abcdef
*/
常量字符串
int main()
{
char* p="abcdef";//"abcdef\0"是一个常量字符串,p中存的是a的地址
//本质是把字符串 abcdef 首字符的地址放到了p中
printf("%c\n",*p);//a
printf("%s\n",p);//abcdef
return 0;
}
错误写法
尝试修改常量字符串
err:Segmentation fault - 段错误
int main()
{
char* p="abcdef";//"abcdef\0"是一个常量字符串,p中存的是a的地址
*p = 'W';//常量字符串不可以改,正确的写法应该在char* p前面加const
printf("%s\n",p);
return 0;
}
例题:
请问打印结果是什么?
int main()
{
char arr1[]="abcdef";
char arr2[]="abcdef";
char * p1="abcdef";
char * p2="abcdef";
if(arr1==arr2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
if(p1==p2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
}
结果:
haha,首元素的地址
hehe,常量字符串只有一份
解析:
这里p1和p2指向的是一个同一个常量字符串。
C/C++会把常量字符串存储到单独的一个内存区域,当几个指针。
指向同一个字符串的时候,他们实际会指向同一块内存。
但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。