深入理解指针4
字符指针变量
指针指向字符变量
char ch = 'w';
char* p = &ch;
指针指向字符数组
char arr[10] = "abcdef";
char* p = arr;
printf("%s\n", arr);
printf("%s\n", p);
结果是一样的
也可以写成:
char* p = "abcdef";//常量字符串
//将字符串首字符a的地址赋值给p
字符数组可以存放字符串,字符数组的内容可以修改
常量字符串和数组是非常相似的,也是在一个连续的空间中存放了多个字符,但是常量字符串的内容不能修改
*p='w';//错误的,常量字符串不能被修改
因此可以写为:
const char* p = "abcdef";
看一道题:
int main(){
char strl[] = "hello bit.";
char str2[] = "hello bit.";
const char* str3 = "hello bit.";
const char* str4 = "hello bit.";
if (str1 == str2)
printf("strl and str2 are same\n");//1
else
printf("strl and str2 are not same\n"); //2
if (str3 == str4)
printf("str3 and str4 are same\n"); //3
else
printf("str3 and str4 are not same\n");//4
return 0;
}
问:打印结果
答案为:2 3
str3和str4完全相同,为了节省内存,str4并不会被创建
str1,str2为数组名,是数组首元素的地址,两个数组创建的是不同的空间,首元素地址不同,故str1!=str2
str3,str4比较的是两个指针变量中存放的地址,所以str3==str4
数组指针变量
存放的是数组的地址——指向数组的指针
&arr——数组的地址
int arr[5] = {
0 };
int(*p)[5] = &arr;
//p为数组指针变量
//int: p指向的数组的元素类型
char arr[8];
char(*pc)[8] = &arr;
char* arr[8];
char*(*pc)[8] = &arr;//指针数组指针
//pc数组指针变量
以
int arr[6] = {
1,2,3,4,5,6 };
int(*p)[6] = &arr;
为例:
因为:
*p = *&arr = arr;
所以求数组长度:
printf("%zd\n", sizeof(arr));
或者:
printf("%zd\n", sizeof(*p));
输出数组:
for (i = 0;i < 6;i++) {
printf("%d ", arr[i]);
}
或者:
for (i = 0;i < 6;i++) {
printf("%d ", (*p)[i]