常见的指针与数组名以及函数名之间的区分
来源:互联网 发布: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阅读全文
0 0
- 常见的指针与数组名以及函数名之间的区分
- 指针与数组名之间的区别
- 数组名的指针
- CppPrimer--数组名与指针& 函数名与函数指针
- 字符数组名与字符串指针变量名的区别
- 指针与数组名的区别
- 数组名与指针的区别
- 数组名与指针的深层探讨
- C数组名与指针的区别
- 数组名与指针的区别 转帖
- 关于数组名与指针的疑惑
- 数组名与指针的不同
- 数组名与指针变量的区别
- 数组名与指针的不同
- 数组名与指针的关系
- 指针与数组名的区别
- 指针变量与数组名的区别
- 数组名与指针的区别
- 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
- 生产报表的自动化实现方案
- Spring中@Configuration和@Bean的作用
- 传智播客资料,帮助想学习.NET的同学
- LeetCode-25-Reverse-Nodes-in-k-Group 链表递归水题
- 常见的指针与数组名以及函数名之间的区分
- php结合redis实现高并发下的抢购、秒杀功能的实例
- 典型的SaaS平台构建--Salesforce CRM介绍
- Android Studio 超级简单的打包生成apk
- JS中Null与Undefined的区别
- 第一次记录
- RF,SeleniumIDE使用store/while循环执行case,注册新用户
- win环境下的cmd命令行python交互时清屏
- mariaDB在linux7中的安装