C语言程序设计学习笔记第十一章指针

第十一章

指针

11.1指针的概念

1.指针即地址

2.怎么获取变量的地址:取地址符号&

#include 

int main(void){
    //整型变量a,存放整型数据
    int a = 10;
    printf("%d\n",a);//输出a的值
    printf("%d\n",&a);//以十进制的整数形式输出a的地址(指针)
    printf("%x\n",&a);//以十六进制的形式输出a的地址(指针)
    printf("%p\n",&a);//以十六进制的形式输出a的地址(指针)
    return 0;
}

 C语言程序设计学习笔记第十一章指针_第1张图片

地址是个常量,不能被修改,且随机

C语言中数据类型与内存大小之间的关系:

C语言程序设计学习笔记第十一章指针_第2张图片

11.2指针变量

C语言程序设计学习笔记第十一章指针_第3张图片

 

#include 

int main(void){
    //变量的定义:类型名  变量名;
    //定义了int型变量a,可以存放int型数据
    int a;//int 是类型名,a是变量名

    //定义了int型指针变量p
    //p可以存放int型变量的指针
    int *p;//int * 是类型名,p是变量名

    int *b,c,*d;//b和d是指针变量,c是普通int型变量

    //char ch = 100;
    //p = &ch;//报错,p只能存放int型变量的地址

    a = 10;//把10存放到a的内存块中
    p = &a;//把a的地址存放到p的内存块中

    //p = 100;//报错,不能将整型的值赋给指针变量型的实体,p只能存放地址数据,不能存放整型数据
    return 0;
}

11.3指针变量的使用

#include 

int main(void){
    int a = 0;
    int b = 0;
    int *p;
    a = 10;
    p = &a;//p存放a的地址,p指向a的内存块

    printf("a的值:%d\n",a);//10
    printf("a的地址:%d\n",&a);

    printf("p的值:%d\n",p);//p里面存放的值就是a的地址
    printf("p的地址:%d\n",&p);//p的地址
    printf("*p的值:%d\n",*p);*p就是a,10

    *p = 20;//间接访问a,相当于a = 20;a = 20为直接访问a
    printf("a的值:%d\n",a);
    printf("*p的值:%d\n",*p);

    p = &b;//在此之前p存放的是a的地址,在这之后p存放了b的地址,即p指向了b的内存块
    *p = 50;
    printf("a的值:%d\n",a);
    printf("b的值:%d\n",b);
    printf("*p的值:%d\n",*p);

    return 0;
}

C语言程序设计学习笔记第十一章指针_第4张图片

 *p:*后面跟的是哪个变量的地址,*p代表的就是哪个变量本身

11.4指针的偏移(指针的运算)

C语言程序设计学习笔记第十一章指针_第5张图片

#include 

int main(void){
    char ch = 0;
    int a = 0;
    float b = 0;
    double d = 0;

    char *p1 = &ch;
    int *p2 = &a;
    float *p3 = &b;
    double *p4 = &d;
    
    printf("%d\n",&ch);
    printf("%d\n",&a);
    printf("%d\n",&b);
    printf("%d\n",&d);

    printf("%d\n",&ch+1);//地址向后偏移了1个存储单元(1个字节)
    printf("%d\n",&a+1);//地址向后偏移了1个存储单元(4个字节)
    printf("%d\n",&b+1);//地址向后偏移了1个存储单元(4个字节)
    printf("%d\n",&d+1);//地址向后偏移了1个存储单元(8个字节)

    return 0;
}

C语言程序设计学习笔记第十一章指针_第6张图片

11.5空指针与野指针

 

 

#include 

int main(void){
    int a = 0;
    int *p;
    *p = 20;//错误,p是野指针,无法访问
    printf("%d\n",a);
    return 0;
}
#include 

int main(void){
    int a = 0;
    int *p = NULL;//此时p为空指针,指针p并不是指向地址为0的存储单元,而是具有一个确定的值“空”
    *p = 20;//错误,p是空指针,无法访问
    printf("%d\n",a);
    return 0;
}
#include 

int main(void){
    int a = 0;
    int *p = NULL;
    p = &a;
    *p = 20;
    
    {
        int b = 30;
        p = &b;
    }
    *p = 50;//p是野指针
    printf("%d\n",a);
    printf("%d\n",*p);
    
    return 0;
}

11.6指针变量作为函数参数

#include 
void fun(int *b);
int main(void){
    int a = 10;
    fun(&a);
    printf("%d\n",a);
    return 0;
}
void fun(int *b){
    *b = 30;//相当于a = 30;间接的修改a的值
}
#include 
void fun(int *x,int *y);
int main(void){
    int a = 10;
    int b = 20;
    fun(&a,&b);
    printf("%d\n",a);
    printf("%d\n",b);
    return 0;
}
//利用指针交换a和b的值
void fun(int *x,int *y){
    int temp = 0;
    temp = *x;
    *x = *y;
    *y = temp;
}

你可能感兴趣的:(C语言程序设计,c语言,开发语言,学习)