zoukankan      html  css  js  c++  java
  • c指针学习小结(参考别人总结的经验)

    指针学习与总结
    一、
    1.int *p :p与*先结合,说明p是一个指针,然后与int结合说明指向的是一个int型的。
    2.int p[3] :p与[]结合说明p是一个数组,然后与int结合,说明数组里的元素是int型的。
    3.int *p[3]: p与[]结合说明p是一个数组,后与*结合,说明数组的指针,后与int型结合,说明指针指向的是int型的。
    4.int (*p)[3] :p与*结合,说明p是一个指针,后与[]结合说明指向的是一个数组,与int结合说明数组的元素是int型。
    5.int **p :p与*结合,说明p一个指针,指向的类型是int *,与*再结合说明*p是一个指针,再与int结合,说明*p指向的是int型。
    6.int p() :p与()结合,说明p是一个函数,再也int结合说明返回值是int型。
    7.int(*p)(int) :p与*结合说明p是一个指针,与()结合,说明指向的是一个函数,再与int结合说明返回值是int型。
    8.int *(*p(int))[3]: p与()结合,说明p是一个函数,与*结合说明返回值是一个指针,指向的类型是int* [3],再与[]结合,说明指向的是一个数组,再与*结合,说明数组里存放的是一个指针,再与int结合,说明
    数组的指针指向元素是int型的。
    二、
    指针的类型,指针指向的类型,指针的值或者指针所指向的内存区,指针本身所占据的内存区
    指针的类型:去掉指针名即是。int *ptr 指针的类型是int*;

        数组与指针的typedef:考虑typedef是类型的重命名,注意是类型不是指向的类型,对指针类型重命名typedef char* PCHAR;//PCHAR是char * 的别名。
        typedef char ARRAY[10];//ARRAY的类型是char [10], ARRAY a;//定义char a[10]
        函数的typedef:typedef int (*PFUN)(int a);//PFUN是一个函数指针
        int printa(int a){printf("a = [%d]",a);}
        PFUN pf ;
        pf = &printa;
        (*pf)(1);


    指针指向的类型:去掉指针名和左面的*即可,int **ptr 指向的类型是int*;
    指针的值或者指针所指向的内存区:在32位机器中, 所有类型的指针的值都是一个32位的整数,指针所指向的内存区就是从指针所代表的的那个地址开始,长度为sizeof(指针指向的类型)的一片内存区。

    三、指针的运算
    char a[20];
    int *p = (int*)a;
    p++;//这里p++之后,p指向下一个int,一般32位机器,即指向了a[4],即p加上了sizeof(int)
    测试代码
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main(){

    char a[34] = "abcdefg1234567890";
    int i ;
    int *p = (int *)a;
    p++;
    for(i=0;i<5;i++)
    {
    printf("%d ",&a[i]);
    }
    printf("========%d ",p);
    }

    code 2 to understand:
    int main(){

    char a[34] = "abcdefghij1234567890";
    char *p = a;
    char **pp = &p;

    //强制理解,把指针看作一个变量,存放的是地址
    printf("%d ",p);//1
    printf("%d ",a);//同1
    printf("%d ",pp);//2
    printf("%d ",&p);//同2
    printf("%d ",*pp);//同1 pp->p ->a则pp = &p, p = a; *pp = p

    printf("%c ",**pp);
    printf("%c ",*p);

    }

    understand 3:
    int a = 12; int b ; int *p ; int **pp;
    p = &a;
    *p = a;
    pp = &p;
    *pp = &b;
    **pp = a;
    四、数组与指针
    int a[10] = {1,2,3,4,5,6,7,8,9,0};
    *a //*(a+0) 1
    *(a+2) // 3
    五、指针与函数的关系
    int f(){
    printf("this is f. ");
    return 1;}
    int main()
    {
    int (*pf)();
    pf = &f;//pf = f也可以? 函数f内存中直接是地址?
    pf();
    }
    六、指针的类型转换

    int a = 10;
    int b;
    char *str;
    int *ptr;
    ptr = &a; // ptr -> a ,ptr存a的地址
    printf("%d ",ptr);
    printf("%d ",&a);
    b = (int)ptr;
    printf("%d ",b);
    str = (char *)b;str -> b,由于b是int,str是字符串,所以要进行强制转换
    printf("%d ",str);
    ptr =(int *)&c;
    printf("%d ",ptr);
    printf("%d ",&c);

    /**************************
    别人的建议数据结构吧,算法才
    是永恒的,程序设计语言层出不穷,永远学不完。学完之后就认真啃
    下STL这根骨头吧,推荐书籍--------范型编程与STL和STL源码剖析。
    **************************/


  • 相关阅读:
    跨浏览器OCX
    安装QT5.02
    Ubuntu登陆密码忘记
    QTableView
    VMware安装时Error 1324. The path My Documents contains a invalid character的原因和解决方法
    VS2005 与虚拟机的那点事
    创建掩码位图来实现透明绘图
    【转载】spring注解整理
    记录spring test类无法插入数据问题
    Uniapp 原生开发uniapp.arr 新老兼容问题
  • 原文地址:https://www.cnblogs.com/ashen/p/4470480.html
Copyright © 2011-2022 走看看