指针进阶

437 words

字符指针

1
2
3
4
5
6
7
8
int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'w';
return 0;

}

这是第一种使用方法,只用来表示一个字符的地址

1
2
3
4
5
6
int main()
{
const char* pstr = "hello world";
printf("%s\n",pstr);
return 0;
}

这是第二种用法,与第一种不同,这里的字符指针只是把这个常量字符串的首元素的地址存入的指针中

对于字符数组来说,即便是相同的字符串也会放在不同的地址;对于字符指针来说,C/C++会把常量字符串存储到一个单独的内存中,当字符串内容完全相同的时候,也就会指向同一块内存

指针数组

顾名思义,指针数组就是由一组指针组成的数组,例如:

1
2
3
int* arr1[10];
char* arr2[4];
char** arr3[5];

数组指针

数组指针实际上是指针而非数组

1
2
int* p1[10];
int (*p2)[10];

对于第一个来说,p1先和方括号结合形成一个数组,数组的类型为$int*$

而对于第二个来说,p1先和星号结合形成一个指针,这个指针再指向一个数组,其中有十个变量,每个变量的类型是$int$

关于数组名

1
int arr[10];

arr是数组名,表示首元素的地址

但是对于&arr来说,他们的指向的地址,打印出来内容是一样的,但实际上&arr表示的是整个数组,一旦加1,arr只会跳过第一个元素,而&arr会跳过整个数组

数组指针的使用

1
2
3
4
5
6
7
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int (*p)[10] = &arr;
return 0;
}

其实这就类似于声明了一个没有说明行数的二维数组

Comments