A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭启冰 中级黑马   /  2015-12-4 22:35  /  861 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


二维数组:
        本质上还是数组,只不过数组中的每一个元素又是数组

我们可以把二维数组看做多行多列的一个平面


        声明语法:
                类型  数组名[行][列];
            例: int  nums[3][5];
                char  chs[2][6]; //2行6列


        取值和赋值:
                数组名[行][列];
            例: nums[0][0]; //取第一行第一列(下标为0的行,下标为0的列)


                数组名[行][列] = 数据;

            例: nums[0][0] = 20;


二维数组的遍历:
        因为它是多行多列,我们正好可以用一个for循环的嵌套来遍历

        因为for循环的嵌套,外层可以控制行,内层可以控制列

        for(int i=0;i<行数;i++){

            for(int j=0;j<列数;j++){

                //赋值

                //输出
            }

        }


二维数组计算行数:
                数组总长度 / 每一行占用的长度

            公式: sizeof(二维数组名) / sizeof(二维数组名[0]);


二维数组计算列数:
                某一行占用的长度 / 类型占用的长度

            公式: sizeof(二维数组名[0]) / sizeof(类型);


二维数组作为函数的参数:
                跟一维数组一毛一样

        1.是引用传递:改变了形参的值,实参也会改变
        2.在函数内不可以计算出正确地行和列,所以如果要在函数内遍历的话,一定要多传至少1个参数(传入行数,为什么不要列数呢?因为列数确定的)

        注意:二维数组作为函数的参数,形参必须定义列数,并且一旦确定好列数,传入的实参一定只能是这个列数的二维数组,其他的会有警告,使用时可能会出问题


三维数组:就是一个数组,只不过这个数组里的每个元素是一个二维数组

………………

N维数组:就是一个数组,只不过这个数组里的每个元素是一个N-1维的数组


指针:
        指针就是内存地址。

内存地址:每一个字节都会有一个地址,每个变量只要记住首地址就能找到这个变量


指针变量:
        就是保存指针的变量

        声明语法:
                类型 *指针变量名;

            例:  int *p;//指向int类型的指针变量
                 char *pc;//指向char类型的指针变量

        
        指针变量的赋值:
                  指针变量名  = 地址;
                例: p  = #
               
                在声明的时候就初始化,那么才*

                 类型 *指针变量名 = #
                    int *p = #


        怎么使用指针变量?
                不用星号来使用:
                        不用星号代表访问的自己的空间(访问的是自己存的地址)
                        int *p = #

                        p;//代表是访问的num的地址

                用星号来使用:
                        用星号代表访问的是别人的空间(访问的是别人空间里存的值)
                        int *p = #
                        *p; //代表访问的就是num;


        注意:星号的使用场景

                如果在声明的时候,*代表类型(或者说,*左边有类型关键字的时候就是代表类型声明)

                如果在其他的时候,*代表取别人空间里的值(或者说,*左边没有类型关键字的时候就是代表访问别人的空间)


        指针变量作为函数的参数:
                指针变量如果作为函数的参数,也是一个局部变量,所以它也会有自己的空间



二级指针:代表一个指针变量指向的是另外一个指针变量

        定义格式: 类型 **变量名;

                 赋值: 变量名 = &一级指针变量名;

        例:
            int num = 10;

            int *p = #//一级指针

            int **pp;//二级指针
            pp = &p; //指向一级指针p的空间


三级指针:指向二级指针的指针变量。

        定义的时候就是三个星

N级指针:指向n-1级指针的指针变量

        定义的个时候n个星

*/

#include <stdio.h>

void test(int nums[][5],int row){
   
    for (int i=0; i<row; i++) {
        
        for (int j=0; j<5; j++) {
            
            
        }
    }
}


void test2(int *p){
   
    int abc = 100;
   
    //*p = 200;//影响的主函数的num
   
    //李四在里面不要张三的钥匙,自己去换了一个别人家的钥匙,但是并不会影响到张三手里的钥匙
   
    p = &abc;//这里改值只是改了自己这个函数内的p里存的地址值,不会影响到实参存的地址
   
}
int main(int argc, const char * argv[]) {
   
    int num = 10;

    int *p = #//张三有num的钥匙
   
    test2(p);//张三把钥匙给李四配了一把
   
    printf("%d\n",*p);//10
   
    //指针变量的声明和*号的解释
    /*
    int *p1,*p3;//声明了p1和p3两个指针变量
   
    int *p5,num1;//声明了p1指针变量和num1整型变量
   
    int *p10,num10,*p11; //两个指针变量分别是p10,p11,还有一个整型变量num10
   
   
    p10;//访问自己的空间
   
    *p10;//访问别人的空间
    */
   
    //二维数组作为函数的参数
    /*
    int nums1[10][5];
   
    test(nums1,5);
   
   
    int num  = 10000;
   
    int *p = #//在声明的时候初始化
   
    int *p2;//先声明
   
    p2 = # //后赋值
   
    printf("%d\n",*p);
    */
    return 0;
}

2 个回复

倒序浏览
谢谢分享
回复 使用道具 举报
记性不好还好有你谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马