zoukankan      html  css  js  c++  java
  • 指针和引用(4)指向指针的指针

    1.知识点

    (1)在程序中可以声明指向任何数据类型的指针,指针也可以指向指针类型,成为指向指针的指针。下面是一个使用例子

    1 int a=10,b=20;
    2 int *q=&a;
    3 int **p=&q;
    4 **p=30;

    (2)如果想通过指针在被调函数中修改主调函数的变量,必须将主调函变量(务必确定该变量的类型,有时候可能变量本身就是指针,这时候形参就需要是指针的指针了)的地址作为参数,在被调函数中修改主调函数指向的内容。

    2.面试题

    2.1指针作为参数的常见错误

     1 int find(char *s, char ch, char *sub) {
     2     for (int i = 0; *(s + i) != '
    '; i++) {
     3         if (*(s + i) == ch) {
     4             sub = s + i + 1;
     5             return i;
     6         }
     7     }
     8     return 0;
     9 }
    10 
    11 int main(int argc, char *argv[]) {
    12     char fullName[] = {"Jordan#Michale"};
    13     char *givenName=fullName;
    14 
    15     int cnt = find(fullName, '#', givenName);
    16     cout << givenName << "has a" << cnt << "characters 'family name" << endl;
    17 
    18     getchar();
    19     return 0;
    20 }

    重点知识点:(1)如果想通过指针在被调函数中修改主调函数的变量,必须将主调函变量的地址作为参数,在被调函数中修改主调函数指向的内容。

    (2)通过指针传递参数时,最大的忌讳就是以为只要参数是指针就万事大吉了。实际上,应该首先确定要修改的变量的类型,然后再将其地址作为参数。如果要修改的变量本身就是指针,就应该将该指针的地址作为参数,此时的形参类型是指向指针的指针。

    以上第三个参数的指向的改变并不能带来实参的改变,正确答案如下:

     1 int find(char *s, char ch, char **sub) {
     2     for (int i = 0; *(s + i) != '
    '; i++) {
     3         if (*(s + i) == ch) {
     4             *sub = s + i + 1;
     5             return i;
     6         }
     7     }
     8     return 0;
     9 }
    10 
    11 int main(int argc, char *argv[]) {
    12 
    13     char fullName[] = {"Jordan#Michale"};
    14     char *givenName=NULL;
    15 
    16     int cnt = find(fullName, '#', &givenName);
    17     cout << givenName << " has a " << cnt << " characters 'family name" << endl;
    18 
    19     getchar();
    20     return 0;
    21 }

     2.2指向指针的指针和二维数组的区别

    1 int main(){
    2   int a[2][3]={{1,2,3},{4,5,6}};
    3   int **p=a;
    4   cout<<**p<<endl;
    5   getchar();
    6   return 0;        
    7 }

    解析:p是指向指针的指针(类型是int **),a<=>&a[0],a[0]是一个一维数组(相当于对一维数组名a[0]取地址,它应该赋值给int *[3])。所以左边是一个指向指针的指针,右边是一个指向数组的指针,两边类型不同。如果想编译通过,应该定义一个指向数组的指针,修改如下:

    1 int (*p)[3]=a;

    小技巧:判断变量的类型:

    变量的类型在声明之初就已经确定了,在程序中只要将声明语句中变量名去掉,剩下的部分就是变量的类型。如下:

    1 int **p的类型是:int**
    2 int a[2][3]的类型是:int[2][3]
    3 const int(const *p)[3]的类型是:const int(cosnt *)[3]
  • 相关阅读:
    数据库 封装类CppSQLite3的helloword VC6
    数据库 sqlite 进阶
    数据库 sqlite3_get_table,sqlite3_free_table
    数据库 sqlite3_open,sqlite3_exec,slite3_close
    数据库 SQLite C++ 接口
    数据库 如何在VC6下使用sqlite3
    MFC CButtonST使用技巧(一)(二)(三)
    MFC CButtonST简介
    MFC CButtonST 在你的程序中如何使用CButtonST类
    MFC静态分割后锁定分隔条/限制分隔条的移动范围 方法1
  • 原文地址:https://www.cnblogs.com/ys99/p/9198104.html
Copyright © 2011-2022 走看看