zoukankan      html  css  js  c++  java
  • C语言学习笔记--数组指针和指针数组

    C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定。(如 int array[5]类型为 int[5])

    1.定义数组类型

    C 语言中通过 typedef 为数组类型重命名:typedef type(name)[size];

    (1)数组类型:如 typedef int (AINT5)[5]; typedef float (AFLOAT10)[10];

    (2)数组定义:AINT5 iArray; AFLOAT10 fArray;

    2.数组指针

    (1)数组指针用于指向一个数组

    (2)数组名是数组首元素的起始地址,但并不是数组的起始地址。

    (3)通过将&作用于数组名可以得到数组的起始地址

    (4)定义数组指针的两种方式:

        ①可通过数组类型定义数组指针:ArrayType* pointer;

        ②可以直接定义:type (*pointer)[n]; //其中 pointer 为数组指针变量名,type 为数组的元素类型,n 为数组的大小

    #include <stdio.h>
    
    typedef int (AINT5)[5];       //数组类型:int[5]
    typedef float (AFLOAT10)[10]; //数组类型:float[10]
    typedef char (ACHAR9)[9];     //数组类型:char[9]
    
    int main()
    { AINT5 a1;
    //定义变量a1为int[5]类型的数组 float fArray[10];//普通定义数组的方法 AFLOAT10* pf = &fArray;//合法。&表示取的是整个数组地址(相当于 //float[10]类型的数组指针。 ACHAR9 cArray; char(*pc)[9] = &cArray;//定义pc指针,并指向cArray数组。类型一致,合法。 //char(*pcw)[4] = cArray;//错误,数组名cArray为首元素的地址(相当于char*)与pcw指针类型不匹配 char(*pcw)[4] = (char(*)[4])cArray; int i = 0; printf("%d, %d ", sizeof(AINT5),sizeof(a1));//4*5=20 for(i=0; i<10; i++) { (*pf)[i] = (float)i; //pf指向整个数组,即相当于&a。而*pf等价于(*&a),即相当于a //即*pf等价于数组名fArray,所以表达式相当于fArray[i] = (float)i; } printf("pf = %X, pf + 1 = %X ", pf, pf+1); //pf + 1,指向数组最后一个元素的后面 for(i=0; i<10; i++) { printf("%f ",fArray[i]);//打印0到9 } printf("%p, %p ,%p ", &cArray, pc+1, pcw+1);//pc+1==>(unsigned int)pc + 1*sizeof(*pc) // ==>(unsigned int)pc + 1*9 //同理pcw + 1 = pcw + 4 return 0; }

    2.指针数组

    (1)指针数组是一个普通的数组,其中的每个元素为一个指针

    (2)指针数组的定义:type* pArray[n];//其中的 type*为数组中元素的类型,pArray为数组名,n 为数组的大小(如 float* a[3])

    #include <stdio.h>
    #include <string.h>
    
    //sizeof(a)表示整个元素的大小
    //a表示首元素地址,*a即取出第1个元素
    #define DIM(a) (sizeof(a)/sizeof(*a))
    
    //table指向一个指针数组,即每个元素为指针类型
    int lookup_keyword(const char* key, const char* table[], const int size)
    {
        int ret = -1;
        
        int i = 0;
        
        for(i=0; i<size; i++)
        {
            if(strcmp(key, table[i]) == 0)
            {
                ret = i;
                break;
            }
        }
        
        return ret;
    }
    
    int main()
    {
    
        const char* keyword[]={
               "do",
               "for",
               "if",
               "register",
               "return",
               "switch",
               "while",
               "case",
               "static"
        };
        
        printf("%d
    ", lookup_keyword("return",keyword,DIM(keyword)));//4
        printf("%d
    ", lookup_keyword("main",keyword,DIM(keyword))); //-1
    
        return 0;
    }

    参考资料:
    www.dt4sw.com
    http://www.cnblogs.com/5iedu/category/804081.html

  • 相关阅读:
    使用 richtextbox 输出程序运行信息
    多线程 更新 winform 控件的值,以避免UI线程的卡顿
    多线程 以及 主程序退出时 子线程的销毁
    supersocket 通过配置文件启动服务 总是 初始化失败的 解决办法
    增删改存储过程 框架
    winform DataGridView 通用初始化
    SQLServer存储过程 实例,很多语法可以以后参考
    Winform中 DataGridView控件中的 CheckBox 的值读出来 始终 为 False ,已解决
    winform中 让 程序 自己重启
    字符数组什么时候要加‘’
  • 原文地址:https://www.cnblogs.com/CoderTian/p/5907895.html
Copyright © 2011-2022 走看看