C/C++第九天——标准C变量

| 阅读:611 发表时间:2017-08-27 23:25:59 C语言

能使用某个变量的语句总和叫做这个变量的作用域

声明在函数内部的变量叫做函数的变量,他的作用域只包含函数内部的所有语句

声明在函数之外的变量叫做全局变量,他们的作用域包含程序中的所有语句

如果函数A的工作时间完整包含函数B的工作时间,则函数B可以使用函数A的存储区。反过来不可以

一个存储区可以被使用的时间范围叫做他的生命周期。局部变量的生命周期就是函数某一次的执行时间范围

声明局部变量的时候可以使用static关键字,这种变量叫做静态局部变量,他的存储区可以被所有函数使用

没有初始化的静态局部变量自动被初始化成0

静态局部变量的初始化只在程序开始时执行一次

目前掌握的跨函数使用存储区的办法有两种,一种被调用函数可以使用调用函数的存储区,另外一种是静态局部变量的存储区可以被任意使用

静态全局变量的作用域只包含声明他的那个文件内部的所有语句

全局变量和局部变量是可以重名的,这个时候语句会优先使用局部变量

指真变量是一种变量,他负责记录一个地址数据

指真变量的使用方法和普通变量区别很大

如果一个指针变量记录了某个存储区的地址则可以根据这个指针变量找到那个存储区

注意:只有捆绑过的指针才能使用

指针也是分类型的,不同类型存储区的地址适合记录在不同类型的指针里

指针演示

#include <stdio.h>

int main() {

int *p_num = NULL,*p_num1 = NULL;

int num = 10;

p_num = &num;

*p_num = 5;

return 0;

}

可以在一条语句中声明多个指针变量,每个指针变量名称钱都要加*

所有没有捆绑过的指针必须记录空地址NULL,这个地址值是0

如果一个指针即使没有捆绑过也没有记录空地址则称为野子指针

程序应该避免出现野指针

指针初始化的时候*没有参与赋值过程

#include <stdio.h>

int main () {

int num = 0,num1 = 0,num2 = 0;

int *p_num = &num,*p_num1 = &num1,*p_num2 = &num2;

printf("请输入3和数字:");

scanf("%d%d%d",p_num,p_num1,p_num2);

}

如果指针记录了数组中第一个存储区的地址则可以通过这个指针找到数组中每个存储区

这个时候可以把指针当做数组名称的使用,给指针增加一个下标就可以用来表示数组中的某个存储区

#include<stdio.h>

int main() {

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

//int *p_num = &arr[0];

int *p_num = arr;

printf("p_num[3]是%d\n",p_num[3]);

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

sizeof(p_num);

sizeof(arr);

printf("&arr是:%p,&p_num是:%p",&arr,&p_num);

return 0;

}

地址数据可以参与如下计算过程

地址+(-)整数 地址 - 地址

地址数据加减整数n实际数值变化是n个捆绑存储区的大小

地址之间做减法得到一个整数,他代表两个地址之间所包含的捆绑区存储区的个数

计算机对下标的处理是把地址加上下标得到下标对应存储区的地址,然后加*找到对应的存储区

*(p_num + 2) 与 arr[2] 的值相等

指针和数组名称的区别

1.数组名称不可以被赋值,指针变量可以被赋值

2.他们的sizeof计算结果不同

3.他们都可以取地址,他们取地址操作的结果不同

数组做函数形式参数的时候真正的形式参数是一个指针变量

#include <stdio.h>

void func (int arr[],int size) {

printf("sizeof(arr)是%d\n",sizeof(arr));

}

int main () {

int arr[5] = {};

printf("sizeof(arr)是%d\n",sizeof(arr));

func(arr,5);

return 0;

}

任何地址数据都可以作为实际参数和指针形式参数配合使用

指针形式参数可以被调用函数使用其他函数的存储区

编写函数交换主函数的两个存储区的内容

#include <stdio.h>

void swap(int *p_num,int *p_num1) {

int tmp = *p_num;

*p_num = *p_num1;

*p_num1 = temp;

}

int main() {

int num = 3,num1 = 7;

swap(&num,&num1);

printf("num是%d,num1是%d\n",num,num1);

return 0;

}

声明指针的时候可以使用const关键字

如果把const关键字写在指针类型名称前面就表示不可以通过这个指针修改捆绑存储区的内容

#include <stdio.h>

int main() {

int num  = 10;

const int *p_num = &num;

int * const p_num1 = &num;

//*p_num = 20

num = 20;

p_num = NUll;

*p_num1 = 20;

//p_num1 = NULL 

return 0;

}

这中指针本身的内容任然可以修改

如果const关键字写在指针变量名称前,就表示指针本身的内容不可以修改

但是可以修改指针捆绑存储区的内容

如果函数执行过程中不会修改指针形式参数所捆绑的存储区则应该在声明指针形式参数的时候加const关键字

(const关键字应该加在类型名称前面)

#include <stdio.h>

void print(const int *p_num,int size) {

int num = 0;

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

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

}

printf("\n");

}

int main() {

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

print(arr,5);

return 0;

}

声明指针的时候如果用void作为类型名称则指针叫做无类型指针,无法通过这种指针知道捆绑存储区的类型

#include<stdio.h>

int main() {

int num = 10;

void *p_v = &num;

*(int *)p_v = 20;

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

return 0;

}

这种指针即不可以在前面加*也不可以进行加减计算

这种指针必须首先强制类型转换成有类型指针然后才能使用

热门推荐