常见的指针与数组名以及函数名之间的区分

本文详细解释了C/C++中指针与数组的各种定义方式及其实际应用,包括int a、int *a、int **a、int (*a)[5]、int (*a)(int)和char *a[4]等,并通过示例代码展示了这些定义如何被使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


参考了网上的一些blog,我对一些常见的指针数组名以及函数名之间的区分作一个简单总结。

1. int a;表示的是一个内存空间,这个空间用来存放一个整数(int);

2. int *a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数(int)的空间;

3.int **a;表示一个内存空间,这个空间用来存放一个指针p1,这个指针指向一个存放指针p2的空间;并且指向的这个空间中里面存放的指针(即p2)指向一个整数。

4.int(*a)[5]表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为5、类型为int的数组;和int** a的用法类似,区别在于,++、+=1之后的结果不一样。但同时两者在指针赋值的时候有所区别,前者int(*a)[SIZE]只能用于指向一维数组,而且一维数组的int数也必须规定为SIZE,否则会编译出错。后者int** a用法比较灵活,可以用于数组或者其他int的类型的指针。

5.int(*a)(int);表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。

6.char *a[4];[]优先级大于*,所以a[]是一个数组,(char*)代表字符指针,所以这是一个包含4个字符指针的数组。

可执行代码如下(不过是将int型换成了char型):

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	char *a[] = { "China", "French", "America", "German" };//该定义可行,[]优先级大于*,所以a[]是一个数组,(char*)代表字符指针,所以这是一个包含4个字符指针的数组。
	printf("%p %p %p %p\n", a[0], a[1], a[2], a[3]); //数组元素中保存的地址  
	printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]);//数组元素单元本身的地址  
	printf("%s %s %c %c\n", a[0], a[1], a[2], a[3]);//数组元素中保存的地址所指向的字符串或字符。
	//a==&a[0];两者等价
	//////////////////////////////////////////////////////////
	char **s = a;//数组名a是常量,可以给别人赋值,但不能a=s;
	printf("**s:以下三个输出等价\n");
	printf("%s\t", *s);
	printf("%s\t", a[0]);
	printf("%s\n", *a);
	/*
	char  b[5] = { "China", "French", "America", "German" };//该定义会出错,因为,一维的字符数组就是相当于一个字符串,接收不了多个字符串的初始化形式
	char (*c)[5] = { "China", "French", "America", "German" };//该定义会出错,因为,c是一个指针,指向一个一维数组;
	*/
	//////////////////////////////////////////////////////////
	printf("char(*p)[10]:\n");
	char szTest[][10] = { "hello", "world" };
	char(*p)[10]; //这里的p是一个指向一维数组的指针,而且char(*p)[SIZE]的参数SIZE必须与要指向的一维数组的SIZE大小相等,否则赋值会出错;
	char *p2;
	p = szTest;
	p = &szTest[0];
	p2 = szTest[0];
	printf("p:%p\n", szTest);
	printf("0:%p\n", szTest[0]);
	printf("1:%p\n", szTest[1]);
	for (int i = 0; i < sizeof(szTest) / 10; i++)
	{
		printf("%s\n", p + i);
	}
	///////////////////////////////////////////////////////////
	printf("char  b[5][10]:\n");
	char  b[5][10] = { "China", "French", "America", "German" };//二维的字符数组就是相当于多个字符串
	printf("%p %p %p %p\n", b[0], b[1], b[2], b[3]);
	printf("%s %s %c %c\n", b[0], b[1], *b[2], *b[3]);
	//////////////////////////////////////////////
	getchar();

	return 0;
}

运行结果:



参考网站:

CSND:深入 char * ,char ** ,char a[ ] ,char *a[] 内核(比较详细)

http://blog.youkuaiyun.com/daiyutage/article/details/8604720

知乎:int a; int* a; int** a; int (*a)[10]; int (*a)(int)区别?

https://www.zhihu.com/question/20481976


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值