pointer

第八章     指针
8.1 指针
定义:
    若在程序中定义了一个变量时,在编译时,系统会给变量分配内存单元。
    编译系统根据程序中定义的变量类型,分配一定长度的空间 。
    内存区的每一个字节有一个编号,即地址,地址指向该变量单元,又称为指针。
数组的性质:
    空间有序;单元连续;类型一致 // int a[10];sizeof(&a+1) - sizeof(&a) = 40 bytes
    //int a;sizeof(&a+1) - sizeof(&a) = 4 bytes
内存错误 in C:
    int a;scanf("%d",a);
    数组越界
    指针变量未指向合法内存
By the way:
    All addresses are unsigned int.
    & and * 互为逆运算.
8.2指针变量
定义:
    存放指针的变量。
    基类型 *指针变量名:
        基类型是指针指向变量的数据类型(基本数据类型,指针型,void 型,构造类型)(sizeof(基类型*) = 4)
    指针变量在定义时需初始化,否则为野指针,指向垃圾内存。
    0 in different form:
        '\0' , 0 , NULL , 1E-5 , false match with the type of char , int, 基类型*,double or float , bool。
性质:
    指针变量的属性(unsigned int);&*运算互逆;指针变量与指针所指对象的区别与操作。
    指针变量与函数参数。
    指针变量位移律:指针变量的类型决定单位位移的字节数。
    利用指针输出数组元素。
    不同基类型的指针可操作不同字节的内容。
    *p:从p所指的地址开始,以p的基类型所占的字节数为偏移量,取当前这段内存空间里面的内容。
8.3通过指针引用数组
    逆序
    排序
{   int *const p1 //p1不可写
    int const * p2 //p2所指向的内容不可写
    const int * p3 //p3与p2类型等价
    const int * const p4 //p4和p4的指向均不可写
}
{
    void *malloc(size_t size)//返回空间连续
    void *realloc(void * memblock,size_t size)//返回空间连续
}
{
    *(++p),*(p++),(*p)++,*p++ 的区分;
}
{   int a[M][N] ,  i , j ; a( int ( * ) [N] ), a[i] (int *) ,a [i][j] (int);
}
{   int (*p)[n];int *q; p = a;q = a;
    *(*(p + i) + j) == *(q + i * n +j) == a[i][j]; //数组指针(指向数组的指针,即行指针),指针数组(数组元素类型为指针型的数组)
    a[i][j] == *(a[i]+j) ==*(*(a+i)+j);
}
{
    函数返回值类型 (*p)(参数列表)
    int (*p)(int,int) ;
    int max(int,int);
    p = max;
    p(int,int) == max(int,int);//函数指针 (指向函数的指针),指针函数(函数返回值类型为指针型的函数)
    int (*p[5])(int,int) //函数指针数组(元素类型为函数指针型的数组)
    int(*fun(int n))(int ,int)//函数指针函数(返回值类型为函数指针型的函数)
    返回指向栈内存(局部空间)的指针非法;
    return 指针合法的两种情况:1 在main()中申请空间,作为子函数的实参,返回该空间;
                                                 2子函数里,调用malloc(),返回该空间,不再需要时调用free();
}
8.4字符串与指针
    1 将一个字符串赋值给字符指针变量时,指针指向字符串常量的首地址。
    2 char *p = "sasdas"; //*p无w权限。
    3字符串常量的地址位于内存常量区,也是*p无权限的原因。
    4 char a[3][80];
       char *p[3] = {"123","aSAAS","dsasd"};//字符串个数已确定,长度不定,使用指针数组。
       char(*q)[80] //字符串个数不定,长度已确定,使用数组指针。
8.5 变量,一维数组,二维数组,函数与指针的联系
{
    int a;
    int b[N];
    int c[M][N];
    int fun(int);
    int *p1;     p1 = &a ,b ,&b[0],b + i,c[i] + j,&c[i][j],*(c+i) + j; //指针变量
    int (*p2)[N];   p2 = &b, c + i,&c[i]//数组指针
    int *p3[N];   p3[i] <=> p1 //指针数组
    int **p4;  p4 = &p3[i]//二重指针  
    int (*p5)(int);  p5 = fun;fun() == p5();// 函数指针
    int *p6(int); p1 = p6;  //指针函数
    int (*p7[N])(int); p7[i] <=> p5// 函数指针数组
}
8.6
{
    main()传参,project settings/Debug;
    子函数形参数组名被编译为指针变量;
    mymalloc();
    swap();
}























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值