ITPub博客

首页 > > > C语言-数组和指针(一)

C语言-数组和指针(一)

作者:dapan 时间:2018-12-19 20:06:40 0 删除 编辑

指针数组和数组指针的定义

指针数组:首先是一个数组,这个数组的每个成员是一个指针变量。

数组指针:首先是一个指针,这个指针指向一个数组。

代码如下

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;
}
p2的大小是0x28对应十进制就是40


数组作为参数传给指针

例子一

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


调试看str的值

一种方法是函数返回值,一种方法是二级指针,大家在写代码的时候要非常注意。

写代码研究问题,一定要理论和实践相结合,不要一味看死书,当然你考研就另说了,实践可以增加我们的理解,多看内存里的东西,这样更加靠谱。


欢迎关注微信公众号-嵌入式Linux

觉得不错,请帮忙转发,点赞,您的每一次支持,我都将铭记于心

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-08-07

  • 博文量
    4504
  • 访问量
    87163