• 二维数组和指向指针的指针


    一道面试题引发的问题,首先要知道[]的优先级高于*,题目:

    char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?

    直接用程序说明:

    #include<stdio.h>
    
    void main()
    {
        char **p,a[6][8];
        p = a;
        printf("\n");
    }
    

    编译,然后就会发现通不过,

    报错:错误 1 error C2440: “=”: 无法从“char [6][8]”转换为“char **” 

    《C专家编程》里10.5节—使用指针向函数传递一个多维数组

    方法一,函数是 void fun(int arr[2][3]); 这种方法只能处理2行3列的int型数组。

    方法二,可以省略第一维的长度。函数是 void fun(int arr[][3]);这种方式虽然限制宽松了一些,但是还是只能处理每行是3个整数长度的数组。

              或者写成这种形式 void fun(int (*arr)[3]);这是一个数组指针或者叫行指针,arr和*先结合使得arr成为一个指针,这个指针指向具有3个int类型数据的数组。

    方法三,创建一个一维数组,数组中的元素是指向其他东西的指针,也即二级指针。函数是 int fun(int **arr);这种方法可以动态处理各行各列不一样长度的数据。

    注意:只有把二维数组改成一个指向向量的指针数组的前提下才可以这么做!比如下面的程序可以正常输出abc:

    View Code
     1 #include <iostream> 
     2 using namespace std; 
     3 void test(char **ptr) 
     4 { 
     5     cout << *ptr << endl; 
     6 } 
     7  
     8 int main() 
     9 { 
    10     char *p[3] = {"abc", "def", "ghi"}; 
    11     test(p); 
    12     return 0; 
    13 }

    数组和指针参数是如何被编译器修改的?

    数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:

    实参                                                      所匹配的形参

    数组的数组          char c[8][10];                 char (*)[10];          数组指针

    指针数组             char *c[10];                   char **c;               指针的指针

    数组指针(行指针)  char (*c)[10];                 char (*c)[10];        不改变

    指针的指针           char **c;                       char **c;               不改变

     1 #include "stdafx.h" 
     2 #include <iostream> 
     3 using namespace std; 
     4  
     5 int _tmain(int argc, _TCHAR* argv[]) 
     6 { 
     7     int arr1[3]; 
     8     int arr2[3]; 
     9     int arr3[3]; 
    10     int * ptr; 
    11     // ptr1是一个指向 int [3] 的指针,即ptr1的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长 
    12     int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}}; 
    13     // ptr2是一个指向 int * 的指针,即ptr2的类型和&ptr是一样的,注意:ptr指向的内存区域不定长 
    14     int * ptr2[3]={arr1,arr2,arr3}; 
    15     // ptr3是一个指向 int [3] 的指针,即ptr3的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长 
    16     int(* ptr3)[3]=&arr1; 
    17     ptr3=ptr1; // 没错,他们的类型相同 
    18  // ptr3=ptr2;//error 无法从“int *[3]”转换为“int (*)[3] 
    19  // ptr4是一个指向 int * 的指针,即ptr4的类型和&ptr是一样的,注意:ptr指向的内存区域不定长 
    20     int ** ptr4; 
    21     //ptr4=&arr1; //error 无法从“int (*)[3]”转换为“int ** 
    22     ptr4=ptr2; // 没错,他们的类型相同 
    23  //ptr4=ptr3; // error 无法从“int (*)[3]”转换为“int ** 
    24     return 0; 
    25 }

    转自:http://www.cnblogs.com/stoneJin/archive/2011/09/21/2184211.html

  • 相关阅读:
    安装MYSQL8.0提示api-ms-win-crt-runtime-l1-1-0.dll 丢失
    【.net】未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法
    Windows 2008 R2 配置 DNS 实现二级域名
    如何修改windows Server 2012 远程桌面连接默认端口
    System x 服务器制作ServerGuide U盘安装Windows Server 2012 R2操作系统
    MYSQL安装后自带用户的作用
    mysql 查看数据库、表的基本命令
    嵌入式必知基础算法
    嵌入式学习网站集合
    C避坑指南
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2616354.html
Copyright © 2020-2023  润新知