参考了网上的一些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