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

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值