指针的用法及说明
2014-07-31 18:09
176 查看
1、一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
int (*p[10])(int);
首先,定义一个函数,这个函数有一个整型参数,并返回一个整型数:int fun(int);
然后,定义一个有10个指针的整型数组:int *p[10];
最后,使指针数组替换函数名,即得到想要的结果:int (*p[10])(int);
2、指针数组和数组的指针:点击打开链接(引用)
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。
下面到底哪个是数组指针,哪个是指针数组呢:
A)
int *p1[10];
B)
int (*p2)[10];
这里需要明白一个符号之间的优先级问题。
“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。我们可以借助下面的图加深理解:
3、以下代码涉及到三点东西:
第二点:指针传值,包括int型和cha型的指针,如果想要利用参数从调用函数中取数据或者申请空间,需要用到指针的指针,否则参数的值可以传过去,但是经过修改后的值无法取回来。
第三点:对malloc函数进行封装,申请内存,申请成功返回true,失败返回false,同时,还要注意申请的变量空间能够传回来以供使用
4、char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?点击打开参考链接
直接用程序说明:
C2440: “=”: 无法从“char [6][8]”转换为“char **”
在《C专家编程》10.3节的小启发里讲的很透彻:(以下这段文字及对比一定要认真分析!)
数组和指针参数是如何被编译器修改的?
“数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:
实参 所匹配的形参
数组的数组 char c[8][10]; char (*)[10]; 数组指针
指针数组 char *c[10]; char **c; 指针的指针
数组指针(行指针) char (*c)[10]; char (*c)[10]; 不改变
指针的指针 char **c; char **c; 不改变
int (*p[10])(int);
首先,定义一个函数,这个函数有一个整型参数,并返回一个整型数:int fun(int);
然后,定义一个有10个指针的整型数组:int *p[10];
最后,使指针数组替换函数名,即得到想要的结果:int (*p[10])(int);
2、指针数组和数组的指针:点击打开链接(引用)
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。
下面到底哪个是数组指针,哪个是指针数组呢:
A)
int *p1[10];
B)
int (*p2)[10];
这里需要明白一个符号之间的优先级问题。
“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。我们可以借助下面的图加深理解:
3、以下代码涉及到三点东西:
#include <stdio.h> #include <malloc.h> #include <string.h> #include <stdbool.h> #define max(a, b) a >b ? a : b; bool get(char **buf) { if((*buf = (char *)malloc(20)) == NULL) return false; strcpy(*buf, "zhaozhanwei"); printf("the buf is %s\n", *buf); return true; } void get1(int *a) { *a = 10; } void main(int argc, char **argv) { int a; bool b; char *buff = NULL; printf("the input is %d : %s\n", argc, argv[0]); a = max(2, 3); printf("a is %d\n", a); //memset(buff, 0, 20); b = get(&buff); if(b == true) printf("the buff is %s\n", buff); else printf("error\n"); get1(&a); printf("a is %d\n", a); }第一点:通过实现宏定义实现比较大小,返回较大的值,其中用到了三元运算符 “?:”。
第二点:指针传值,包括int型和cha型的指针,如果想要利用参数从调用函数中取数据或者申请空间,需要用到指针的指针,否则参数的值可以传过去,但是经过修改后的值无法取回来。
第三点:对malloc函数进行封装,申请内存,申请成功返回true,失败返回false,同时,还要注意申请的变量空间能够传回来以供使用
4、char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?点击打开参考链接
直接用程序说明:
void main() { char **p,a[6][8]; p = a; printf("\n"); }编译,然后就会发现通不过,报错:错误 1 error
C2440: “=”: 无法从“char [6][8]”转换为“char **”
在《C专家编程》10.3节的小启发里讲的很透彻:(以下这段文字及对比一定要认真分析!)
数组和指针参数是如何被编译器修改的?
“数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:
实参 所匹配的形参
数组的数组 char c[8][10]; char (*)[10]; 数组指针
指针数组 char *c[10]; char **c; 指针的指针
数组指针(行指针) char (*c)[10]; char (*c)[10]; 不改变
指针的指针 char **c; char **c; 不改变
相关文章推荐
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- [教程]JScript中的变量引用规则(补充,函数用法说明)
- Regsvr32 用法和错误消息的说明
- Regsvr32 用法和错误消息的说明
- zlib用法简单说明
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- Dreamweaver插件用法简要说明
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- SQLSERVER2000一些内置存储过程用法和说明
- J2EE中JSP中日期的用法说明
- 标准数字格式字符串用法说明及举例
- 指向数组的指针用法例程
- 举例说明在汇编语言中,"[]"的用法
- Regsvr32 用法和错误消息的说明
- DEBUG用法详细说明
- const修饰指针和引用的用法【转贴】
- document.execCommand()用法说明
- 讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
- regsvr32命令用法说明