栈
每个独立运行的程序都是自己独占一片内存区域且互不影响,程序占用内存空间是申请一个或多个非常大的数组,如果是多个要关联起来。
每个程序都占的内存比较大,其中分成多个小小的内存,被不同的子程序占用。
struct AA
{
}
struct BB
{
}
void m4()
{
}
void m1()
{
}
void m2()
{
m1();
}
void m3()
{
m2();
}
int main()
{
int a=9;
int b=10;
if(a<b)
{
int c=88;
if(c>80)
{
int d=44;
}
//d在这里报错
}
m2();
m3();
//a在这里报错,超过区域(大括号)会报错。
return 0;
}
方法之间的传参
#include <stdio.h>
void m2(int *w1,int *w2)
{
*w1=20;
w2[2]=99;
}
void m1(int x1,int *x2,int* x3)//方法的入参和在方法体里面声明的变量没有什么区别
{
x1=1;//改变不了
*x2=2;//传的引用可以改变
x3[0]=11;
x3[1]=33;//传的数组可以改变
m2(x2,x3);//注意这两处的不同
}
int main()
{
int a=10;
int b=20;
int c[5]={1,2,3,4,5};//一维数组传参的时候会按照指针类型去接收
m1(a,&b,c);//注意这两处的不同
printf("a=%d,b=%d,c[0]=%d,c[1]=%d,c[2]=%d",a,b,c[0],c[1],c[2]);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct AA
{
int a;
char b;
struct AA* c;//struct AA c;不可以,嵌套它自己会报错。
struct AA* cc;
}A;
typedef struct BB
{
int a;
A* b;
A d;
struct BB* c;
}B;
void m1(A s1,A* s2,A* s3)//在c++中入参可以A &s1,用这样传参,但是在c语言中不允许。
{
}
void k1(int w1[4],int *w2)
{
printf("%d %d\n",sizeof(w1),sizeof(w2));
}
int main()
{
A x1,x2,x3;
x1.a=11;
x1.b='@';
x2.a=33;
x2.b='#';
A* w1=(A*)malloc(sizeof(A));
w1->a=123;
w1->b='w';
//下面这种类型是被允许的,因为里面的三个类型都是int
int e1=22,e2=55;
int* e3=(int*)malloc(sizeof(int)*3);
e3[0]=e1;//这里其实给的地址,但地址也是数字,其实是被允许的,e3 0和1的位置存的不是22和55,而是其对应的地址
e3[1]=e2;
e3[2]=e1;
/*
//下面这种不被允许,因为w2指向了三个A类型的数据,而不是他们的地址。
A* w2=(A*)malloc(sizeof(A)*3);
w2[0]=x1;//相当于类型不匹配,等号左边是A类型数据,等号右边是int类型指针。
w2[1]=&x2;
w2[2]=&x3;
return 0;
*/
A* w2=(A*)malloc(sizeof(A)*3);
w2[0]=x1;
w2[1]=x2;
w2[2]=x3;
m1(x1,w2,w1);
m1(x2,w1,w2);
int m1[]={1,2,3,4};
A m2[]={x1,x2,x3};
printf("%d,%d",sizeof(m1),sizeof(m2));
/*
typedef struct AA
{
int a;
char b;
struct *AA c;
}A;
这种情况下输出是16,48;也就是说一个结构体占16字节,这样看起来struct *AA c;创建的c占11字节,但其实它只占8字节。
typedef struct AA
{
int a;
char b;
struct *AA c;
struct *AA cc;
}A;
这种情况下输出是16,72;也就是说一个结构体占24字节,印证了上面的想法;
*/
k1(m1,m1);//这里执行k1之后输出8 8,也就是说在传参过程中数组是指针;也就是说如果传过来是数组无法计算其大小。int类型可以数组第一个元素用来存大小
return 0;
}