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; }

浙公网安备 33010602011771号