发布时间:2023-12-23 16:00
1.字符指针
int main()
{
char c = \'w\';
char* pc = &c;
printf(\"%c\\n\", *pc);
char* str = \"abcdef\";//将字符串常量的首地址赋给str
//注意不能通过str修改内容,因为“abcdef”是字符串常量,存放在常量区中,是只读的
//*str = \'w\';
printf(\"%s\\n\", str);
/*int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
int* parr[3] = { arr1, arr2, arr3 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf(\"%d \", *(parr[i] + j));
}
printf(\"\\n\");
}*/
return 0;
}
上面代码需要注意的是不能通过指针来修改字符串常量的值,这一定要引起重视,因为大部分编译器不会对该操作报错,这样就产生了难以发现的bug,若要解决,应在指针声明时加上const修饰。如下:
int main()
{
const char* pc = \"abcdef\";
*pc = \'w\';
//编译器会报错,因为加上const后,无法通过指针来改变变量的值;
}
(2)面试题
int main()
{
char* p1 = \"abcdef\";
char* p2 = \"abcdef\";
char arr1[] = \"abcdef\";
char arr2[] = \"abcdef\";
if (p1 == p2)
{
printf(\"p1 == p2\\n\");
}
else
{
printf(\"p1 != p2\\n\");
}
if (arr1 == arr2)
{
printf(\"arr1 == arr2\\n\");
}
else
{
printf(\"arr1 != arr2\\n\");
}
return 0;
}
运行如下:
为什么会出现以上结果呢?因为“abcdef”已经存放在常量区了,计算机为了节省空间,则创建的指针都指向同一个字符串常量,而对于数组,则在栈区开辟空间,新的数组会开辟不同的空间,只是以“abcdef”进行初始化,所以地址值会不同。
2.指针数组
指针数组的定义:type* pa[numbers] 表示数组元素为指向type的指针,元素个数为numbers。
使用:
int main()
{
int arr1[] = { 1,1,2 };
int arr2[] = { 2,3,4 };
int* arr[] = { arr1, arr2 };//存放数组首元素的首地址
return 0;
}
3.数组指针
定义:(应与指针数组区别)type (*p)[numbers], 表示一个指针,指向了元素类型为type的数组
使用: (1)打印一维数组
void print(int(*p)[5], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf(\"%d \", *(*p + i));//p解引用得到的是数组名
}
}
int main()
{
int arr[] = { 1,2,3,4,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
print(&arr, sz);
return 0;
}
但是这种方式相比下标引用显得十分复杂,并没用必要使用,但是二维数组的使用就能方便的使用了。
(2)二维数组的打印
void print(int(*p)[5], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(\"%d \", *(*(p + i) + j));
//p + i 找到第i行,解引用得到第i行,最后相当于一维数组的使用
}
}
printf(\"\\n\");
}
int main()
{
int arr[][5] = { {1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7} };
//int sz = sizeof(arr) / sizeof(arr[0]);
print(arr, 3, 5);//arr表示二维数组首元素的地址:&arr[0],实际上指向第0行
return 0;
}