关于指针的总结—②未完待续

---恢复内容开始---

指针的运算

指针的本质就是个整数,因此从语法上来说整数能使用的运算符它都能使用。
不是所有的运算符对指针运算都是有意义的。
指针+整数 <=> 指针+宽度*整数 向右移动
指针-整数 <=> 指针-宽度*整数 向左移动
指针-指针 <=> 指针-指针/宽度 计算出两个指针之间相隔多少个元素。

 

指针与const:
const int* p; 保护指针指向的数据,不能通过指针解引用修改内存的值。
int const *p; 保护指针指向的数据,不能通过指针解引用修改内训的值。
int * const p; 保护指针变量,指针变量初始化之后不能再显式的赋值。
const int *const p; 既不能修改指针的值,也不能修改内存的值。
int const * const p; 既不能修改指针的值,也不能修改内存的值

#include <stdio.h>

int main()
{
    const int num = 10;
    int const *p = &num;
    // *p = 100;
    int * const p1 = &num;
    *p1 = 100;
    p1 = NULL;
}

 

什么是二级指针

 A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量,

二维指针:指向指针的指针,它是个指针变量,但它存储的是指针变量的地址。
float * p = NULL;
定义:float** pp = &p;
使用:*pp <=> p; **p <=> *p;

函数之间共享普通变量使用一级指针,共享指针变量需要使用二级指针。

#include <stdio.h>
#include <stdlib.h>

void create_memory(void** p,int size)
{
    *p = malloc(size);
}

int main()
{
    int* p = NULL;
    create_memory(&p,40);
    printf("%p\n",p);
    for(int i=0; i<10; i++)
    {
        printf("%d ",p[i]);
    }
}

 

 

 

 

函数指针:
函数就是存储在代码段中的一段数据,当被调用时跳转到那个位置去执行,而函数名就是这段数据的首地址(函数指针),因此函数名就是个指针。
程序员可以自己定义函数指针来指向函数:
1、写出函数的声明
2、为函数名添加小括号
3、修改函数名,并在函数名前加*

定义好函数指针后就可以指向函数了,通过()就可以调用函数,而不用*解引用。
函数指针真正的作是可以把函数当作参数在函数之间进行传递,然后达到一效果:多年前写的代码来调用现在所定的代码,这种模式叫回调。

 

 

指针数组:由指针变量构成的数组。
定义:char* arr[5]; // 定义一个长度为5的数组,成员类型是char*
相当于定义的5个 char* 指针变量,char *p1,*p2,*p3,*p4,*p5;
使用:arr[0] = "hehe"; printf("%s\n",arr[i]);
sizeof(arr) => 20个字节

数组指针:专门用来指向数组的指针。
int arr[10];
定义:int (*p)[10] = NULL;
p + 1 => 40;
更多时候用来指向二维数组,当使用二维数组当函数参数时,应该使用数组指针来当形参。
C语言中没有真正的二维数组,是用一维数组模拟的。

 

posted on 2018-12-28 10:06  FutureNow  阅读(140)  评论(0编辑  收藏  举报