• 11-C语言指针


    目录:

    一、指针

    二、指针与数组

    回到顶部

    一、指针

    1 内存被分为字节,每个字节有唯一地址,指针保存的是内存中的地址。

    2 保存指针的变量,就叫指针变量,(保存地址)

    3 声明一个指针变量

    int i = 0;

    int* p;//声明一个指针变量 int*指针类型

    int * p;  int* p;  int *p;//这几种写法都行

    4 每个指针变量能指向一种特定类型的对象。

    5 指针是引用数据类型,因为本身没有保存最终数据,只是保存了数据的地址,间接的找到内存中的数据。

    6 指针的用法

    指针可用于参数,传递变量的地址,相当于多个函数共享内存地址(内存空间)。

    7 值传递:相当于不同变量,指向不同区域

    地址传递:相当于同一变量,指向同一区域

    p:指针的值          &i:取i的地址

    *p:指针指向的值     i:变量名

    练习:

    1)有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数查看调换后的值。

    2)从键盘上输入5个数,使用一个函数求5个数中最大值、最小值,注意函数没有返回值。

    指针也可以做为返回值,但不要返回自动变量。因为局部变量的生命周期,当函数结束,局部变量会被自动清除。

    3)指针支持加整数、减整数、指针的比较和相减,但运算的单位由指针的类型决定。

    #include <stdio.h>
    
    //指针的基本使用
    void test(){
        int i = 10;
        //声明指针
        int* p;
        //int * p2;
        //int *p3;
        //赋值
        p = &i;
        //取值
        printf("i val: %d
    ",i);
        printf("i address: %p
    ",&i);
        printf("p val: %d
    ",*p);//*p指针指向的值
        printf("p address: %p
    ",p);//p是指针的值
    }
    
    //指针可用于参数,传递变量的地址;
    void test2(int* p){
        printf("p->val:%d
    ",*p);
        *p = 20;
        printf("p->val:%d
    ",*p);
    }
    
    //练习:1)有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数查看调换后的值。
    void test3(int* p1,int* p2){
        printf("p1->%d,p2->%d
    ",*p1,*p2);
        int temp = 0;
        temp = *p1;
        *p1 = *p2;
        *p2 = temp;
        printf("p1->%d,p2->%d
    ",*p1,*p2);
    }
    
    //2)从键盘上输入5个数,使用一个函数求5个数中最大值、最小值,注意函数没有返回值。
    void test4(int size,int array[],int* maxp,int* minp){
        for (int i = 0; i < size; i++) {
            if (array[i] > *maxp) {
                *maxp = array[i];
            }
            if (array[i] < *minp) {
                *minp = array[i];
            }
        }
    }
    
    //指针也可以做为返回值,但不要返回自动变量(局部变量)。因为局部变量的生命周期,当函数结束,局部变量会被自动清除。解决方案,增长生命周期。
    int* test5(){
        static int i = 10;
        int* p = &i;
        return p;
    }
    
    //指针支持加整数、减整数
    void test6(){
        int array[5] = {9,2,3,4,5};
        printf("array address:%p
    ",array);
        int* p = array;
        printf("p address:%p
    ",p);
        printf("p->val:%d
    
    ",*p);
        //指针+1 地址+4
        printf("p+1 address:%p
    ",p+1);
        printf("p+1->val:%d
    ",*(p+1));
        //
        printf("
    *(p+1)->val:%d
    ",*(p+1));
        printf("(*p)+1->val:%d
    
    ",(*p)+1);
        //遍历数组
        for (int i = 0; i < 5; i++) {
            printf("p+%d->val:%d
    ",i,*(p+i));
            printf("array[%d]:%d
    ",i,array[i]);
            printf("array+%d:%d
    
    ",i,*(array+i));
        }
        //存储空间
        printf("array size:%ld
    ",sizeof(array));
        printf("p size:%ld
    ",sizeof(p));
        //赋值
        int array2[6] = {0};
        int* p2 = array2;
        printf("
    p address:%p
    ",p);
        p = p2;
        printf("p address:%p
    ",p);
        
    }
    int main(int argc, const char * argv[])
    {
        test6();
        
    //    int* p = test5();
    //    printf("p:%p
    ",p);
    //    printf("p->val:%d
    ",*p);
        
    //    test();
        
    //    int i = 10;
    //    int* p = &i;
    //    printf("i val:%d
    ",i);
    //    test2(p);
    //    printf("i val:%d
    ",i);
        
        
    //    int i = 2;
    //    int j = 3;
    //    int* p1 = &i;
    //    int* p2 = &j;
    //    printf("i:%d,j:%d
    ",i,j);
    //    test3(p1,p2);
    //    printf("i:%d,j:%d
    ",i,j);
        
    //    int num[5] = {0};
    //    int max = 0,min = 100;
    //    for (int i = 0; i < 5; i++) {
    //        printf("输入第%d个数:
    ",i);
    //        scanf("%d",&num[i]);
    //    }
    //    test4(5,num,&max,&min);
    //    printf("max:%d
    ",max);
    //    printf("min:%d
    ",min);
        return 0;
    }

    回到顶部

    二、指针与数组

    1 占用空间

    数组占用空间 = 数组元素占用空间*长度

    指针占用空间 = 在64位系统下,固定8个字节,与指针类型无关。

    2 赋值

    数组是不可以修改其值,指针可以多次赋值。

    作业:

    1)在键盘上输入5个数,求和差积商,使用函数解决,没有返回值,在main函数中输出结果。

    2)使用函数交换两个值,在main函数中输出结果。

    3)在键盘上输入一个秒数,使用函数求时分秒,在main函数中输出结果。

    4)在键盘上输入5个数,使用函数返回最大值,返回值的类型为指针类型。

     1 #include <stdio.h>
     2 /*
     3  1)在键盘上输入5个数,求和差积商,使用函数解决,没有返回值,在main函数中输出结果。
     4  */
     5 void test1(int length,int num[],int* sum,int* cha,int* ji,int* shang){
     6     for (int i = 0; i < length; i++) {
     7         *sum += num[i];
     8         *cha -= num[i];
     9         *ji *= num[i];
    10         *shang /= num[i];
    11     }
    12 }
    13 /*
    14  2)使用函数交换两个值,在main函数中输出结果。
    15  */
    16 void test2(int* p1,int* p2){
    17     int temp = 0;
    18     temp = *p1;
    19     *p1 = *p2;
    20     *p2 = temp;
    21 }
    22 /*
    23  3)在键盘上输入一个秒数,使用函数求时分秒,在main函数中输出结果。
    24  */
    25 void test3(int miaoshu,int* h,int* minute,int* miao){
    26     *h = miaoshu / 3600;
    27     *minute = miaoshu % 3600 / 60;
    28     *miao = miaoshu % 60;
    29 }
    30 /*
    31  4)在键盘上输入5个数,使用函数返回最大值,返回值的类型为指针类型。
    32  */
    33 int* test4(int length,int num[]){
    34     static int max = 0;
    35     int* p = &max;
    36     for (int i = 0; i < length; i++) {
    37         if (num[i] > max) {
    38             *p = num[i];
    39         }
    40     }
    41     return p;
    42 }
    43 int main(int argc, const char * argv[])
    44 {
    45     int num[5];
    46     for (int i =0; i < 5; i++) {
    47         printf("输入第%d个数:",i+1);
    48         scanf("%d",&num[i]);
    49     }
    50     int* p1 = test4(5,num);
    51     printf("最大值:%d
    ",*p1);
    52     
    53 //    int miaoshu,hour,minute,miao;
    54 //    printf("输入秒数:");
    55 //    scanf("%d",&miaoshu);
    56 //    test3(miaoshu,&hour,&minute,&miao);
    57 //    printf("%d时%d分%d秒
    ",hour,minute,miao);
    58     
    59 //    int i = 2;
    60 //    int j = 3;
    61 //    test2(&i,&j);
    62 //    printf("i:%d,j:%d
    ",i,j);
    63     
    64 //    int num[5];
    65 //    int sum = 0,cha = 0,ji = 1,shang = 1;
    66 //    int length = 5;
    67 //    for (int i =0; i < 5; i++) {
    68 //        printf("输入第%d个数:",i+1);
    69 //        scanf("%d",&num[i]);
    70 //    }
    71 //    test1(length,num,&sum,&cha,&ji,&shang);
    72 //    printf("和:%d
    ",sum);
    73 //    printf("差:%d
    ",cha);
    74 //    printf("积:%d
    ",ji);
    75 //    printf("商:%d
    ",shang);
    76     return 0;
    77 }
  • 相关阅读:
    Luogu P2633 Count on a tree
    Luogu P4011 孤岛营救问题
    Luogu P3157 [CQOI2011]动态逆序对
    SCOI2015 国旗计划
    AT2165 Median Pyramid Hard
    BZOJ2959 长跑
    SCOI2015 情报传递
    SDOI2011 染色
    SCOI2010 幸运数字
    SHOI2016 黑暗前的幻想乡
  • 原文地址:https://www.cnblogs.com/yangmx/p/3474235.html
Copyright © 2020-2023  润新知