打赏

3.9-day09-C语言基础-变量和函数

变量和函数
 
变量分成三种,全局变量,局部变量和块变量
 
变量的作用域指的是可以使用某个变量的变量名的所有语句总和
 
变量的生命周期指的是在程序运行期间变量可以被使用的时间范围
 
全局变量的作用域包括程序的所有语句,它的生命周期是整个程序运行期间
 
局部变量的作用域包括声明它的那个函数中所有语句,它的生命周期是那个函数的某次运行时间段
 
块变量的作用域包括声明它的那个大括号内部的所有语句,它的生命周期是那个大括号的某次运行时间段。
 
不同类型变量可以重名,使用时遵守就近原则
 
栈是一种变量使用方式,遵循的原则是后进先出
 
sleep函数可以让程序停止指定的秒数,秒数由参数指定。需要包含文件unistd.h。
 
程序在内存中运行的时候是分段存储的。
 
代码段用来存储所有的语句,在运行时代码段中的内容不可以被修改
 
栈是程序运行中的一个段落,用来管理某些变量。
函数的局部变量,形式参数都被放置在栈中。
 
堆用来管理手动创建和销毁的变量。
 
auto关键字可以用来声明变量,所有局部变量自动是auto的,所以不需要特别声明。
 
static关键字可以用来声明静态变量。静态全局变量的作用域被缩小成声明它的那个文件里面的所有语句。静态局部变量的生命周期被拉长到整个程序运行期间。
 
register关键字可以用来声明寄存器变量。
 
volatile关键字可以声明易变变量。
 
const关键字可以用来声明不可变变量。
 
指针变量是用来记录地址数据的变量。指针变量声明语法如下
int *p_value;
其中*表示指针变量,int表示可以使用这个指针变量表示另外一个int类型的变量。
指针变量可以使用赋值操作符进行赋值,只有对指针变量赋值后才可以使用指针变量表示另外一个变量。
 
一个指针变量可以表示一个数组中的所有普通变量
 
指针变量的大小是4个字节
 
NULL表示空地址,其实是数字0。记录空地址的指针变量叫做空指针。所有无效指针必须被设置成空指针。记录无效地址的指针叫做野指针,程序中不应该出现野指针。
 
指针变量可以进行强制类型转换,转换后得到的指针记录的地址就是原指针中的地址数据,但是他们的类型不同,所以使用方法也不同。
 
指针变量可以作为函数的形参使用,调用这种函数必须使用地址数据作为实参。
 
负责把调用函数的数据传递给被调用函数的参数叫做输入参数。
负责把被调用函数的数据传递给调用函数的参数叫做输出参数。
有些参数既是输入参数又是输出参数
只有指针变量可以当输出参数使用
 
void*类型的指针可以记录任何类型变量的地址,在使用的时候必须首先强制类型转换成固定类型指针然后再加*。

01var.c
/*
   变量练习
*/
#include <stdio.h>
int value1;     //全局变量
void func() {
    int value2 = 2;    //局部变量
    printf("value2是%d\n", value2);
}
int main() {
    int value4 = 4;    //局部变量
    {
        int value3 = 3;    //块变量
        printf("value3是%d\n", value3);
        printf("value4是%d\n", value4);
    }
    //func();
    //printf("%d\n", value3);
    return 0;
}

 如果这样,value3=13,块变量的作用域包括声明它的那个函数中所有语句,它的生命周期是那个大括号的某次运行时间段。
 
 


02var.c

 
 1 /*
 2    变量练习
 3 */
 4 #include <stdio.h>
 5 int value;
 6 int main() {
 7     printf("value是%d\n", value);
 8     int value = 2;
 9     printf("value是%d\n", value);
10     {
11         printf("value是%d\n", value);
12         int value = 3;
13         printf("value是%d\n", value);
14     }
15     printf("value是%d\n", value);
16     return 0;
17 }

 全局变量;块变量;局部变量;


 03stack.c
 
/*
   栈的练习
*/
#include <stdio.h>
int stack[10];
int num;

void push(int value) {
    stack[num] = value;
    num++;                  //入栈
}

int pop() {
    num--;
    return stack[num];
}                       //出栈

  int empty() {
    return 0 == num;
}            

int full() {
    return 10 == num;
}

int main() {

    return 0;
}
push:推动,增加;
pop:离开,脱落;
 

04clock.c

/*
   秒表练习
*/
#include <stdio.h>
#include <time.h>
#include <unistd.h>
int main() {
    int start = time(0);
    while (1) {
        printf("%ld\r", time(0) - start);
        fflush(stdout);
        sleep(1);
    }
    return 0;
}
fflush(stdout);
这条语句可以把输出缓冲区里的内容立刻显示在屏幕上。
sleep函数可以让程序停止指定的秒数,秒数由参数指定;

 

 


05static.c

 1 /*
 2    静态变量练习
 3 */
 4 #include <stdio.h>
 5 void f() {
 6     static int value = 0;
 7     printf("value是%d\n", value);
 8     value++;
 9 }
10 int main() {
11     f();
12     f();
13     return 0;
14 }
static静态局部变量:
静态局部变量生命周期被拉长到整个程序运行期间;

 

如果去掉static关键字,变成局部变量;

 


06const.c

 1 /*
 2    const关键字练习
 3 */
 4 #include <stdio.h>
 5 int main() {
 6     const int value = 0;
 7     printf("value是%d\n", value);
 8     //value = 3;
 9     value++;
10     printf("value是%d\n", value);
11     return 0;
12 }

加const变量在阿里云的CentOS也是编译不过去的。


07ptr.c

/*
   指针练习
*/
#include <stdio.h>
int main() {
    int value = 0;
    int *p_value = &value, *p_value1 = &value;
    printf("p_value是%p\n", p_value);
    printf("*p_value是%d\n", *p_value);
    *p_value1 = 3;
    printf("*p_value是%d\n", *p_value);
    return 0;
}


08ptr.c

 

/*
   指针练习
*/
#include <stdio.h>
int main() {
    /*int value1 = 0, value2 = 0;
    int *p_value = &value1;
    *p_value = 5;
    p_value = &value2;
    *p_value = 7;
    value1 += *p_value;*/
    int values[2];
    int *p_value = values;
    *p_value = 5;    //values[0] = 5
    p_value++;
    *p_value = 7;    //values[1] = 7
    *(p_value - 1) += *p_value;  //values[0] += values[1]
    return 0;
}

09ptr.c

/*
   指针练习
*/
#include <stdio.h>
int main() {
    int values[] = {1, 2, 3, 4, 5};
    int *p_value;
    for (p_value = values; p_value <= (values + 4); p_value++) {
        printf("%d ", *p_value);
    }
    printf("\n");
    return 0;
}


10ptr.c

/*
   指针练习
*/
#include <stdio.h>
int main() {
    int value = 0;
    int *p_value = NULL;
    p_value = &value;
    printf("大小是%d %d\n", sizeof(p_value), sizeof(int *));
    return 0;
}


11ptr.c

/*
   指针练习
*/
#include <stdio.h>
int main() {
    int value = 134643;
    int *p_value = &value;
    printf("*p_value是%d\n", *p_value);
    printf("*(unsigned char *)p_value是%d\n", *(unsigned char *)p_value);
    return 0;
}


12ptr.c

/*
   指针练习
*/
#include <stdio.h>
int add(int value, int value1) {
    value = 10;
    return value + value1;
}
int add1(int *p_value, int *p_value1) {
    *p_value = 10;
    return *p_value + *p_value1;
}
int main() {
    int value = 3, value1 = 5;
    int ret = add(value, value1);
    printf("value是%d\n", value);
    printf("结果是%d\n", ret);
    ret = add1(&value, &value1);
    printf("value是%d\n", value);
    printf("结果是%d\n", ret);
    return 0;
}

这种情况下,&value - 传给, *p_value1 ,值为10; 10+10=20;

 

这种情况下,实参传给形参的值是&value1的值,这种情况下的值是5

 10 + 5=15;

 

 13ptr.c

/*
   指针练习
*/
#include <stdio.h>
int main() {
    int value = 3;
    char ch = 'a';
    float fvalue = 4.7;
    void *p_value = NULL;
    p_value = &value;
    printf("value是%d\n", *(int *)p_value);
    p_value = &ch;
    printf("ch是%c\n", *(char *)p_value);
    p_value = &fvalue;
    printf("fvalue是%g\n", *(float *)p_value);
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 

posted on 2018-11-29 22:48  XuCodeX  阅读(154)  评论(0)    收藏  举报

导航