指针详解
1.字符指针
int main()
{
char str1[] = "hello world.";
char str2[] = "hello world .";
char *str3 = "hello world .";
char *str4 = "hello world.";
if(str1 ==str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 ==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
输出的结果是str1 and str2 are not same
str3 and str4 are same
因为"hollow world"是常量字符串,C/C++常把常量字符串存储在同一内存块中,当几个指针同时指向同一个常量字符串的时候,实际是指向同一块内存。 而 用相同的常量字符串去初始化不同的数组,其实开辟出了不同的内存块。
2.指针数组
是一个存放指针的数组,本质没有变还是数组;
int *arr[10];//存放十个整形指针的数组
char *arr1[10];//一级字符指针数组
char **arr2[10];//二级字符指针数组
char *arr[3] = { "abc", "bnm","cnm"};//实际上是存放a b c的地址,也就是字符串的首地址,而不是把所有字符全部存进去。
3. 数组指针
本质是指针
int (*p)[3] ;//p是指针 指向一个有三个整型元素的数组
数组指针int (*p)[3] 和指针数组int p[ 3] 的区别;[ ] 的优先级高于,没有() p就先和 [ ] 结合 成数组,有(*p)就先结合成指针;
4. &数组名和 数组名
这也是很容易弄错的地方,因为有特列
int arr[2] = {0};
printf("%p\n", arr);
printf("%p\n",&arr);
可以尝试这段代码,看输出结果是否相同。
其实结果是相等的,但它们所表示的意义不一样
int main() {
int arr[10] = { 0 };
printf("arr = %p\n", arr);
printf("&arr= %p\n", &arr);
printf("arr+1 = %p\n", arr+1);
printf("&arr+1= %p\n", &arr+1);
return 0;
}
结果就会发现结果并不相同,
因为arr表示的是首元素地址 你加一是它指向第二个元素
&arr表示的是真个数组的地址,你加一他就指向下一个数组,
跳过的是整个数组的大小,是10个整型元素也就是40个字节;
但也有列外
sizeof(arr) 里的arr代表的是整个数组地址;而不是首地址,&数组名 也是整个地址
除此之外 数组名全是首地址
5.数组指针的使用
既然是数组指针,那数组指针中存放的应该是数组地址
void print_arr1(int arr[3][5], int row, int col)
{
int i = 0;
for (i = 0; i<row; i++)
{
for (j = 0; j<col; j++)
{
printf("%d ", arr[i][j]);
} printf("\n");
}
}
void print_arr2(int(*arr)[5], int row, int col)
{
int i = 0;
for (i = 0; i<row; i++)
{
for (j = 0; j<col; j++)
{
printf("%d ", arr[i][j]); }
printf("\n");
}
}
int main() {
int arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
print_arr1(arr, 3, 5);
//数组名arr,表示首元素的地址
//但是二维数组的首元素是二维数组的第一行
//所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址
//可以数组指针来接收
print_arr2(arr, 3, 5);
函数指针
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}
void (*pfun1)() = test; 是一个指针函数 指向test
函数指针数组
int (*parr1[10]])();
还是结合性的先后顺序,同前面指针数组和数组指针。