指针

1.sizeof运算符

#include <stdio.h>
int main()
{
    int a = 10;
    char b = 'a';
    //sizeof运算符计算数据类型在内存中占的字节大小,返回值类型为unsigned int ->size_t
    //格式 : sizeof(数据类型) sizeof(变量名)
    int len = sizeof(a);
    int lens = sizeof(b);
    printf("整型变量在内存中占的字节大小:%d
",len);
    printf("字符型变量在内存中占的字节大小:%d
",lens);
    /*
        char ->1
        short ->2
        int ->4
        long ->4
        float ->4
        double ->8
    */
    return 0;
}


2.变量内存地址的打印

#include <stdio.h>
int main(void)
{
    int a =10;
    int b =20;
    //占位符 %p 打印数据的内存地址 unsigned int 十六进制表示
    printf("变量a的内存地址:%p
",&a);
    printf("变量b的内存地址:%p
",&b);
    return 0;
}


3.指针地址

#include <stdio.h>
int main()
{
    int a = 10;
    //获取变量a的内存地址
    //指针类型定义
    //int* p =&a;
    //指针变量
    int* p;
    //指针变量p和变量a建立关系
    p = &a;
    //打印内存地址
    printf("%p
",&a);
    printf("%p
",p);
    //打印变量的值
    printf("%d
",a);
    //*p 对指针变量p进行取值操作
    //& 升维度 *降维度
    printf("%d
",*p);
    return 0;
}


  4.通过指针改变数据值

#include <stdio.h>
int main()
{
    int a = 10;
    //int* 是一种数据类型
    int* p = &a;
    //* 运算符
    *p = 100;
    printf("%d
",a);
    return 0;
}

#include <stdio.h>
int main()
{
    //指针在内存中占的字节大小
    int a = 10;
    int* p = &a;
    int len = sizeof(p);
    //所有指针类型在32位操作系统下是4字节,在64位操作系统中占8字节
    printf("整型指针在内存中占的字节:%d
",len);
    printf("字符型指针在内存中占的字节:%d
",sizeof(char*));
    printf("短整型指针在内存中占的字节:%d
",sizeof(short*));
    printf("长整型指针在内存中占的字节:%d
",sizeof(long*));
    printf("单精度型指针在内存中占的字节:%d
",sizeof(float*));
    printf("双精度型指针在内存中占的字节:%d
",sizeof(double*));
    return 0;
}


5.指针作为函数参数

#include <stdio.h>
void swap(int* a,int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
int main()
{
    int a = 10;
    int b = 20;
    //值传递 形参不能改变实参的值
    //地址传递,形参可以改变实参的值
    swap(&a,&b);
    printf("%d
",a);
    printf("%d
",b);
    return 0;
}


6.数组作为函数参数

#include <stdio.h>
//int arr[] 数组名作为函数参数会退化为指针
//数组名本身就是一个地址 指向数组的首地址
void BubbleSort(int* arr,int len)
{
    int i,j;
    int temp;
    for(i=0;i<len-1;i++)
    {
        for(j=0;j<len-i-1;j++)
        {
            if(arr[j]>arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr [j+1];
                arr[j+1]=temp;
            }
        }
    }
    return;
}
int main()
{
    int i;
    int arr[]={8,1,5,9,2,10,6,3,7,4};
    BubbleSort(arr,10);
    for(i=0;i<10;i++)
    {
        printf("%d
",arr[i]);
    }
    return 0;
}


7.函数返回值为指针类型

#include <stdio.h>
int a = 10;
int* test()
{
    return &a;
}
int main()
{
    int* p = test();
    printf("%p
",p);
    printf("%p
",&a);

    printf("%d
",*p);
    printf("%d
",a);
    return 0;
}


8.指针和数组

8.1

#include <stdio.h>
int main()
{
    int arr []  ={1,2,3,4,5,6,7,8,9,10};
    //数组名是数组的首地址  是一个常量
    printf("%p
",&arr[0]);
    printf("%p
",arr);
    return 0;
}

8.2

#include <stdio.h>
int main()
{
    int arr []  ={1,2,3,4,5,6,7,8,9,10};
    //在将数组赋值给指针变量时,不需要取地址操作 本身就是地址
    int * p;
    p = arr;
    printf("%d
",arr[0]);
    //通过指针间接操作数组
    printf("%d
",p[0]);
    //int* 指针+1 内存地址相当于 +sizeof(int);
    printf("%d
",*(p+1));
    return 0;
}

8.3指针当做数组操作

#include <stdio.h>
int main()
{
    int i;
    int arr []  ={1,2,3,4,5,6,7,8,9,10};
    //在将数组赋值给指针变量时,不需要取地址操作 本身就是地址
    int * p;
    p = arr;
    for(i=0;i<10;i++)
    {
        printf("%d ",*(p+i));
        if(*(p+i) ==10)
        {
            printf("
");
        }
    }
    for(i=0;i<10;i++)
    {
        //指针加上偏移量
        printf("%d ",*(p+i));
    }
    return 0;
}

8.4 指针减法

#include <stdio.h>
int main(void)
{
    int step;
    char ch [] ="hello world";

    //指向o字符元素
    char* p = &ch[4];
    //ch数组名默认指向第一个数组下标
    step = p -ch;
    printf("%d
",step);
    return 0;
}


 9.指针数组

#include <stdint.h>
int main()
{
    int i;
    int a = 10;
    int b = 20;
    int c = 30;
    //指针数组  指针类型的数组
    int* arr[3] ={ &a,&b,&c};
    //指针数组存储指针变量
    *arr[2] = 123;
    for(i=0;i<3;i++)
    {
        printf("%d
",*arr[i]);
    }
    return 0;
}


10.多级指针

#include <stdio.h>
int main()
{    int a = 10;
    int b = 20;
    //使用一级指针接收变量地址
    int* p =&a;
    int* q =&b;
    //使用二级指针接收一级指针的地址
    int** p1 = &p;
    printf("%d
",**p1);//-->10

    *p1 = q;//间接改变一级指针的值
    printf("%d
",**p1);//-->20
    **p1 = 123;//二级指针间接改变变量的值
    printf("%d
",**p1);//-->123
    return 0;
}

原文地址:https://www.cnblogs.com/zjm1999/p/10383041.html