C++课程第一课中出现的问题的探讨
2016-03-28 16:42
302 查看
课程中间出现了一些很重要也比较有意思的问题,教学相长,又让我复习了一遍指针,废话不说,进入正题。
problem 1: 指针数组到底是什么?
指针数组,即存放指针(地址)的数组,数组的每一个元素都是一个指针,语法格式举例,int *p[3]; 在运算符的优先级中,括号的优先级最高(中括号的优先级仅次于小括号),因此,对于int *p[3] ,首先,编译器识别p[3],这代表数组,再识别int *这 代表数据类型是int指针型,在这里,我们换一种写法使之更好理解,其实,我更喜欢这种写法,我们把 int *p[3]写成 int* p[3](int * 和int*是一样的,这里只是为了更好理解!体现c语言书写的自由性);说完了定义,它有什么用呢,主要应用于接收多个字符串。
problem 2:int *p[3]是指针数组,那int (*p)[3]又是什么鬼?
首先依然是说明,int (*p)[3] 是指向长度为3的数组的指针! 刚才说过了,小括号的优先级最高,因此,编译器先识别(*p)显然,这是一个指针,然后编译器又遇到了[3],显然,这是一个数组,又(*p)在前面,显然,(*p)被理解为数组的更高一维(联系二维数组int a[3][4],a[0],a[1],a[2]是三个长度为4的一维数组)
说了半天,有什么用啊,int (*p)[3]主要用来处理二维数组
problem 3:二重指针又是什么啊?
说明: 二重指针,就是指向指针的指针,写法举例 ,int **p;好吧,该死的维数又来了,让我们从int **p的最右边读起,p是一个二重指针,它只能存储指针变量的地址,*p是一个指针,他只能存储 int 型变量的地址,**p是整型变量。
有什么用呢?int x=1; int *p=&x;int q=&p;cout<<**p<<endl;(为了输出个int 你至于吗?)
problem 4:主函数的参数问题,http://blog.csdn.net/liuzhan214/article/details/49977391 这个我以前写过,如果依然不明白就再看看 char *p[3]的含义
problem 5;指向函数的指针
说明,函数也有入口地址,所以,也有指向函数的指针,这个纯粹语法,看下示例就ok
problem 1: 指针数组到底是什么?
指针数组,即存放指针(地址)的数组,数组的每一个元素都是一个指针,语法格式举例,int *p[3]; 在运算符的优先级中,括号的优先级最高(中括号的优先级仅次于小括号),因此,对于int *p[3] ,首先,编译器识别p[3],这代表数组,再识别int *这 代表数据类型是int指针型,在这里,我们换一种写法使之更好理解,其实,我更喜欢这种写法,我们把 int *p[3]写成 int* p[3](int * 和int*是一样的,这里只是为了更好理解!体现c语言书写的自由性);说完了定义,它有什么用呢,主要应用于接收多个字符串。
<span style="font-family:Courier New;">#include <iostream> #include <cstdio> using namespace std; int main() { char *p[3]={"123","456","789"};//对比char *p="123"思考 cout<<p[0]<<endl; cout<<p[1]<<endl; printf("%s\n",p[2]); return 0; }</span>
problem 2:int *p[3]是指针数组,那int (*p)[3]又是什么鬼?
首先依然是说明,int (*p)[3] 是指向长度为3的数组的指针! 刚才说过了,小括号的优先级最高,因此,编译器先识别(*p)显然,这是一个指针,然后编译器又遇到了[3],显然,这是一个数组,又(*p)在前面,显然,(*p)被理解为数组的更高一维(联系二维数组int a[3][4],a[0],a[1],a[2]是三个长度为4的一维数组)
说了半天,有什么用啊,int (*p)[3]主要用来处理二维数组
<span style="font-family:Courier New;">#include <iostream> #include <cstdio> using namespace std; int main() { int a[3][4]={{1,1,1,1},{2,2,2,2},{3,3,3,3}}; int (*p)[4];//指向长度为4的数组的指针 for(p=&a[0];p<=&a[2];p++) //或者for(p=a;p<=a+2;p++),二维数组的维的理解还是很重要的 { for(int i=0;i<4;i++) { cout<<(*p)[i]<<" "; } cout<<endl; } return 0; }</span>
problem 3:二重指针又是什么啊?
说明: 二重指针,就是指向指针的指针,写法举例 ,int **p;好吧,该死的维数又来了,让我们从int **p的最右边读起,p是一个二重指针,它只能存储指针变量的地址,*p是一个指针,他只能存储 int 型变量的地址,**p是整型变量。
有什么用呢?int x=1; int *p=&x;int q=&p;cout<<**p<<endl;(为了输出个int 你至于吗?)
<span style="font-family:Courier New;">#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { char *p[3]={"123","456","789"}; char **q; for(q=&p[0];q<=&p[2];q++) //一重指针遍历普通数组,二重指针遍历指针数组 { cout<<*q<<endl; } return 0; }</span>
problem 4:主函数的参数问题,http://blog.csdn.net/liuzhan214/article/details/49977391 这个我以前写过,如果依然不明白就再看看 char *p[3]的含义
problem 5;指向函数的指针
说明,函数也有入口地址,所以,也有指向函数的指针,这个纯粹语法,看下示例就ok
<span style="font-family:Courier New;">#include <iostream> #include <cstdio> #include <cstring> using namespace std; int Max(int x,int y) { return x>y?x:y; } int Min(int x,int y) { return x<y?x:y; } int main() { int a=3,b=5; int (*p)(int,int); //定义指向函数的指针变量p,指向的函数的返回值,参数列表必须与之一致 p=Max; cout<<(*p)(a,b)<<endl; p=Min; cout<<(*p)(a,b)<<endl; return 0; }</span>
相关文章推荐
- C++ 重载输出运算符<<
- 设计模式--组合模式C++实现
- 【poj 1416】Shredding Company 中文题意&题解&代码(C++)
- 【poj 2627】 Sudoku 题意&题解&代码(C++)
- C++中的函数指针与函数对象的总结(转载,作者佚名)
- 用C++设计一个不能被继承的类
- 浅谈C++多态性
- C++中智能指针的设计和使用
- VC++动态链接库编程之MFC DLL
- C++对象模型
- C++静态库与动态库
- C++项目中的extern "C" {}
- C++的函数重载
- C/C++内存泄漏及检测
- 第一个CPP程序,入门必备
- C++中extern “C”含义深层探索
- C#调用C++ dll及dll编写方法
- C++ 对象的内存布局
- C++对象模型那点事儿(布局篇)
- C++中的static关键字