首页 > > > C语言-数组和指针(一)
指针数组:首先是一个数组,这个数组的每个成员是一个指针变量。
数组指针:首先是一个指针,这个指针指向一个数组。
代码如下
int *p1[10];//[]的优先级大于*,p1是一个数组,数组的值是一个指针
int (*p2)[10];我们在很多地方都可以看到数组和指针混用的,但是数组和指针是一个东西吗?
绝对不是一个东西,数组就是数组,指针就是指针,只不过有时候批着外衣的狼。

p1是一个数组,代表10个int*变量的整体
p2是一个指针,只能代表一个指针变量,在32机里面就是一个4bytes空间大小的地址。
测试代码
#include "stdio.h"
int main()
{
char (*p1)[10];
char *p2[10];
getchar();
return 0;
}

例子一
#include "stdio.h"
void showArray(char arr[10])
{
int size = 0;
size = sizeof(arr);
printf("size:%d\n",size);
}
void showP(char *p)
{
p[1] = 'A';
printf("%s\n",p);
}
int main()
{
char p1[10] = {"1234567890"};
printf("%s\n", p1);
p1[9] = '\0';
showP(p1);
showArray(p1);
printf("%s\n",p1);
getchar();
return 0;
}函数传参数的时候,我们正常会传一个值的拷贝过去,但是数组是一块连续的内存区域,如果直接拷贝过去,速度会很慢,而且会很占内存,所以~下面这句话
C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元
素首地址的指针。
所以上面的size的值应该是4

大家可以自己测试下输出的结果
看代码
#include "stdio.h"
void GetMemory(char *p, int num)
{
p = (char *)malloc(num * sizeof(char));
}
int main()
{
char *str = NULL;
GetMemory(str,10);
strcpy(str, "hello");
printf("%s\n",str);
free(str);
return 0;
}大家看看这个代码有什么问题?
str传给函数的并不是函数本身,而是它的一个拷贝,我们姑且命名为str,所以p = (char*)malloc(num*sizeof(char)); 实际上是 _str = (char*)malloc(num*sizeof(char));后面再调用strcpy(str)就异常了。

函数可以这样修改
#include "stdio.h"
char * GetMemory(char *p, int num)
{
p = (char *)malloc(num * sizeof(char));
return p;
}
void GetMemoryA(char **p, int num)
{
*p = (char *)malloc(num * sizeof(char));
}
int main()
{
char *str = NULL;
str = GetMemory(str,10);
strcpy(str, "hello");
printf("%s\n",str);
free(str);
GetMemoryA(&str, 10);
strcpy(str, "woaini");
printf("%s\n", str);
free(str);
getchar();
return 0;
}

一种方法是函数返回值,一种方法是二级指针,大家在写代码的时候要非常注意。
写代码研究问题,一定要理论和实践相结合,不要一味看死书,当然你考研就另说了,实践可以增加我们的理解,多看内存里的东西,这样更加靠谱。
欢迎关注微信公众号-嵌入式Linux
觉得不错,请帮忙转发,点赞,您的每一次支持,我都将铭记于心
原文作者:;如有侵权,请联系管理员删除。