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

来源:互联网 发布:linux 关闭防火墙命令 编辑:程序博客网 时间:2024/06/17 22:37

参考了网上的一些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.csdn.net/daiyutage/article/details/8604720

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

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