C++课程第一课中出现的问题的探讨

来源:互联网 发布:少林足球 知乎 编辑:程序博客网 时间:2024/06/07 22:53

课程中间出现了一些很重要也比较有意思的问题,教学相长,又让我复习了一遍指针,废话不说,进入正题。

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>



0 0