栈区存储情况

while (p[i].nNumb > 0 && i < _countof(g_data))
	{
		i;
		//if (p[i].nNumb <= 0)
		//	break;	//定位空闲位
	}

大于零则进入循环等价于小于等于跳出循环

64位下,变量内存位置情况

#include <stdio.h>

int power(int i)//0x00007FF6A1CB1B70
{
	i++;//0x000000b13ef2fbf0

	return i;//
}

int main()//0x00007FF6A1CB2AD0  函数地址
{
	int x = 1;//0x000000B13EF2FC14
	int y = 2;//0x000000B13EF2FC34
	int z = 15;//0x000000B13EF2FC54
	int n = power(z);//0x000000B13EF2FC74
	return 0;
}

64.drawio.png

在程序进入main函数之前全局变量已经的初始化完毕,在程序离开main函数之后仍然保持数值不丢失。换句话说就是:全局变量的生命期很大,比main函数的生命期还长。

局部变量占用的内存区域是栈区,全局变量占用的内存区域是全局区(也叫静态区),两种内存区域一般在地址上相距甚远。

c、c++中只能包含头文件,头文件只能放声明不能函数定义、全局变量定义。

一个全局变量的定义在整个软件工程只能有一份,全局变量的声明可以有多份。Link error链接式错误 和 编译时错误,

函数出入栈

#include<stdio.h>
int power(int nNumb, int nPow)//0x00000041E676F960    0x00000041E676F968
{
	int nRes = 1;//0x00000041E676F864
	printf("power:\tnNumb->0x%p{%d} nPow->0x%p{%d} nRes->0x%p{%d}\n",
		&nNumb, nNumb, &nPow, nPow, &nRes, nRes);
	while (nPow--)
		nRes *= nNumb;
	return nRes;
}
void display(int nNumb, int nPow)
{
	int n = 0;
	printf("display:nNumb->0x%p{%d} nPow->0x%p{%d} n->0x%p{%d}\n",
		&nNumb, nNumb, &nPow, nPow, &n, n);
	n = power(nNumb, nPow);
	printf("%d的%d次方是:%d\n", nNumb, nPow, n);
}
int main()//0x00007FF6EE0D1AC0
{
	int n = power(3, 4);//0x00000041E676F984
	display(2, 5);
	n = power(7, 2);
	printf("main:\tn->0x%p{%d}\n", &n, n);
	return 0;
}

image.png

1、请列出static关键字有哪些作用?

C语言有两种:修饰全局变量(函数)和修饰局部变量。
C++还有两种:修饰成员变量和成员函数。

面试题:在C语言中,static关键字的作用有哪些?

a)在一个函数前加上static关键字修饰之后,这个函数将禁止被跨文件访问,只限于在当前源文件中使用;

image.png

b)在一个全局变量的定义前加上 static修饰之后,这个全局变量也将被禁止跨文件访问,只限于在当前源文件中使用;

c)如果一个全局变量或函数不加static修饰时,在整个软件工程中只能有一份同名的全局变量或函数,否则在编译时将出现连接错误;
d)如果一个全局变量或函数加了static修饰之后,每一个源文件中都可以有一份同名的全局变量或函数,而编译时不会出现(同名冲突的)连接错误;

e)如果在一个函数内的局部变量前加上static修饰之后,这个变量已经不是纯粹的局部变量了。编译之后它与全局变量处于同一空间内,这个函数内的静态变量的生命期与全局变量相同,变量在程序进入main函数之前已经初始化完毕。

在C++语言中,static还有另外两个功能,就是修饰成员变量与成员函数。
变量处于同一空间内,这个函数内的静态变量的生命期与全局变量相同,变量在程序进入main函数之前已经初始化完毕。
在C++语言中,static还有另外两个功能,就是修饰成员变量与成员函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值