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;
}