C语言变量和指针

男孩和青春只限于校园,踏出校园就要当成熟稳重的男人。。。

----  网易云热评

一、变量

非静态局部变量的作用域是函数里面的所有语句, 生命周期是函数某一次执行的时间

静态局部变量的作用域是函数里面的所有语句, 生命周期是没有限制的

静态全局变量的作用域只包含它所在文件里的所有语句,生命周期也是没有限制的

非静态全局变量的作用域和生命周期都是没有限制的

#include <stdio.h>

int val1 = 0;    //非静态全局变量

static int val3 = 0;   //静态全局变量

int main() {

    int val = 0;   //非静态局部变量

    static int val2 = 0;   //静态局部变量

    return 0;

}


 

#include <stdio.h>

//这个函数可以用来计算多个数字的和

int sum(int val) {

    static int ret = 0;  //静态变量的初始化只在程序开始的时候执行一次,和这条语句所在的位置无关

    ret += val;   //每次ret变量里都保留上一次sum函数结束时的内容

    return ret;

}

int main() {

    int num = 0;

    for (num = 1;num <= 5;num++) {

        printf("%d\n", sum(num));

    }

    return 0;

}

二、指针

1、指针变量

#include <stdio.h>

typedef int *pint_t;   //给整数类型指针起名字叫pint_t,以后就可以在程序里用pint_t代表指针类型

int main() {

    int val = 0;

    int *p_val = &val, *p_val1 = NULL/*空地址*/;   //*表示变量是一个指针变量

    //pint_t p_val, p_val1;  //声明两个整数类型指针

    p_val = &val;  //把val变量存储区的地址赋值给指针p_val,可以认为以后指针p_val就指向了变量val

    *p_val = 10;   //指针变量名称前使用*操作符可以表示指针指向的变量(存储区)

    printf("val是%d\n", val);

    return 0;

}

2、交换数据

#include <stdio.h>

int main() {

    int val = 3, val1 = 7;

    int *p_val = &val, *p_val1 = &val1; //声明两个指针分别指向这两个整数变量

    /*val ^= val1;

    val1 ^= val;

    val ^= val1;

    printf("val是%d,val1是%d\n", val, val1);*/

    *p_val ^= *p_val1;

    *p_val1 ^= *p_val;

    *p_val ^= *p_val1;

    printf("*p_val是%d, *p_val1是%d\n", *p_val, *p_val1);

    return 0;

}

3、判断大小

#include <stdio.h>

int main() {

    int val = 0, val1 = 0, val2 = 0;

    int *p_min = &val;   //p_min指针永远指向最小数字所在的存储区

    printf("请输入三个数字:");

    scanf("%d%d%d", &val, &val1, &val2);

    if (*p_min > val1) {

        //处理val1里的数字比val更小的情况

        p_min = &val1;

    }

    if (*p_min > val2) {

        //val2变量里的数字更小

        p_min = &val2;

    }

    printf("最小数字是%d\n", *p_min);

    return 0;

}

4、指针加减运算

#include <stdio.h>

int main() {

    int arr[] = {1, 2, 3, 4, 5};

    int *p_val = arr;

    int num = 0;

    printf("arr是%p\n", arr);

    printf("arr + 1是%p\n", arr + 1);

    printf("arr - 1是%p\n", arr - 1);

    for (num = 0;num <= 4;num++) {

        printf("%d ", arr[num]);

        printf("%d ", *(arr + num/*得到下标为num存储区的地址*/)/*下标为num的存储区*/);

        printf("%d ", *(p_val + num/*得到下标为num存储区的地址*/)/*下标为num的存储区*/);

    }

    printf("\n");

    printf("&arr[3] - arr是%d\n", &arr[3] - arr);  //结果是3,表示两个地址之间包含3个整数类型存储区

    return 0;

}



arr是00EFFBAC

arr + 1是00EFFBB0

arr - 1是00EFFBA8

1 1 1 2 2 2 3 3 3 4 4 4 5 5 5

&arr[3] - arr是3

 

5、指针加1,相当于加该数据类型的大小

#include <stdio.h>

int main() {

    int arr[] = {1, 2, 3, 4, 5};

    int *p_tmp = NULL;

    for (p_tmp = arr;p_tmp <= arr + 4/*最后一个存储区的地址*/;p_tmp++) {

        printf("%d ", *p_tmp);

    }

    printf("\n");

    return 0;

}

6、const关键字

#include <stdio.h>

int main() {

    int val = 0;

    const int *p_val = &val;   //不可以通过这种指针对它指向的存储区做赋值操作

    int * const p_val1 = &val; //不可以对这种指针本身做赋值

    //*p_val = 10;     错误

    p_val = NULL;

    *p_val1 = 10;

    //p_val1 = NULL;   错误

    return 0;

}

 

7、无类型指针

#include <stdio.h>

int main() {

    char ch = 'e';

    int val = 34;

    float fval = 6.3f;

    void *p_v = NULL;  //无类型指针

    p_v = &ch;   //无类型指针指向字符类型存储区

    printf("%c\n", *(char *)p_v);

    p_v = &val;

    printf("%d\n", *(int *)p_v);

    p_v = &fval;

    printf("%g\n", *(float *)p_v);

    return 0;

}

8、指针参数

#include <stdio.h>

void print(const int *p_val/*数组形参的本质就是一个指针*/, int size) {

    int num = 0;

    for (num = 0;num <= size - 1;num++) {

        printf("%d ", *(p_val + num));

    }

    printf("\n");

}

int main() {

    int arr[] = {1, 2, 3, 4, 5};

    print(arr, 5);

    return 0;

}

9、返回值为地址

#include <stdio.h>

int * /*指针类型存储区用来存放作为返回值的地址*/read(void) {

    static int val = 0;

    printf("请输入一个数字:");

    scanf("%d", &val);

    return &val;

}

int main() {

    int *p_val = read();

    printf("数字是%d\n", *p_val/*表示read函数里val变量存储区*/);

    return 0;

}

 

10、通过指针判断大小

#include <stdio.h>

int *max(const int *p_val, int size) {

    const int *p_max = p_val;    //为了和p_val指针一致所以声明的时候需要使用const关键字

    const int *p_tmp = NULL;

    //指针循环变量从第二个存储区开始一直

    //指到最后一个存储区为止

    for (p_tmp = p_val + 1;p_tmp <= p_val + size - 1;p_tmp++) {

        if (*p_tmp > *p_max) {

            //当前存储区内容比p_max指针指向的

            //存储区内容还大

            //这个时候当前存储区更有资格

            //成为最后的结果

            p_max = p_tmp;    //p_max指针指向当前存储区

        }

    }

    return (int *)p_max;

}

int main() {

    int arr[] = {40, 80, 30, 60, 20, 50};

    int *p_max = max(arr, 6);

    printf("最大数字是%d\n", *p_max);

    return 0;

}

 

11、交换数组里面的数值

#include <stdio.h>

int * /*用返回值代表处理结果*/reverse(int *p_val, int size) {

    int *p_head = p_val;   //永远指向配对存储区中前面的那个,开始时指向第一个存储区

    int *p_tail = p_val + size - 1;  //永远指向配对存储区里后面那个存储区,开始时指向最后一个存储区

    //每循环一次把一对配对存储区的内容

    //做交换

    while (p_head < p_tail) {  //两个指针既没有相遇也没有交错

        //把两个指针指向的存储区内容做交换

        //就可以了

        *p_head ^= *p_tail;

        *p_tail ^= *p_head;

        *p_head ^= *p_tail;

        p_head++;   //p_head指针指向下一对存储区

                    //里前面那个

        p_tail--;   //p_tail指针指向下一对存储区

                    //里后面那个

    }

    return p_val;   //把数组里第一个存储区的地址做返回值

}

int main() {

    int arr[] = {1, 2, 3, 4, 5, 6};

    int num = 0;

    reverse(arr, 6);

    for (num = 0;num <= 5;num++) {

        printf("%d ", arr[num]);

    }

    printf("\n");

    return 0;

}

 

 

欢迎关注公众号:顺便编点程

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值