c语言基础学完进阶,c语言进阶教程
文章第一天,判断数组长度*a和a[5]数据类型。数据类型和内存有关系吗?Typedef:别名变量。空型变量存储器四个区域1。堆栈区域2。堆栈区域3。全球第4区。代码区域将堆栈区域中的数据声明为全局数据,不会被释放。
第一天
确定数组长度# includesdio.h
int main()
{
int a[]={0,4,6,7,9,10,2,4,5 };
int n=sizeof(a)/sizeof(a[0]);
printf(len of array: %d\n ,n);//n=9
}
*a和a[5]#包括stdio.h
#包含stdlib.h
void print_array(int *a,int n)
{
int m=sizeof(a)/sizeof(a[0]);
printf(len of a at func: %d\n ,m);
for(int I=0;I n;我)
{
printf(%d ,a[I]);
}
printf( \ n );
}
void sort_array(int *a,int n)
{
内部温度;
for(int I=0;I n;我)
{
for(int j=I 1;j n;j)
{
如果(阿[j]阿[i])
temp=a[j],a[j]=a[i],a[I]=temp;
}
}
printf( \ n );
}
int main()
{
int a[]={0,4,6,7,9,10,2,4,5},temp
int n=sizeof(a)/sizeof(a[0]);
printf(len of array: %d\n ,n);//9
printf(原始数组:\ n );
print_array(a,n);
sort_array(a,n);
printf(排序数组:\ n );
print_array(a,n);
返回0;
}
/*
阵列透镜:9
原始数组:
函数为2的透镜
0 4 6 7 9 10 2 4 5
排序数组:
函数为2的透镜
0 2 4 4 5 6 7 9 10
*/int * temp;//temp是int指针,*temp是指针所指空间的大小。
int a[]={0,4,6,7,9,10,2,4,5},*temp,I;//temp是int指针,*temp是指针所指空间的大小。
int n=sizeof(a)/sizeof(a[0]);
printf( % d % d % d % d % d % d \ n ,n,sizeof(temp),sizeof(*temp),sizeof(temp[0]),sizeof(I));//9 8 4 4 4
char * chr
printf(%d %d\n ,sizeof(chr),sizeof(* chr));/8 1
//指针类型长度,32位:4
//64位:8
数据类型
数据类型和内存有关系吗?这很重要。为了更好地管理数据,数据类型是固定内存大小的别名。编译器不会为数据类型分配空间。只有根据类型创建变量,编译器才会分配空间。Sizeof是运算符,不是函数。
int main()
{
int a;
int b[10];
//数据类型的本质:固定内存块大小别名
//能通过sizeof测试的,不是函数,是运算符
printf(sizeof(a)=%d,sizeof(b)=%d\n ,sizeof(a),sizeof(b));//sizeof(a)=4,sizeof(b)=40
//打印地址
//b,b:表示的数据类型不同。
//b,数组第一个元素的地址,一个元素4个字节,1,4
//b,整个数组的第一个地址,一个数组4 * 10,1,40
printf(b:%d,b:%d\n ,b,b);//b:6421984,b:6421984
printf(b 1:%d,b 1:%d\n ,b 1,B1);//b 1:6421988,b 1:6422024
}
Typedef:别名变量。typedef无符号int u32
//typedef通常与结构一起使用。
结构MyStruct
{
int a;
int b;
};
typedef结构MyStruct2
{
int a;
int b;
} TMP
int main()
{
struct MyStruct m1
//my struct m2;//错误
TMP m3
返回0;
}
空隙类型
Void没有类型。
参数为空。定义函数时,可以用void修改int func(void)。在C语言中,这种情况下必须写void,而C可以不写。该函数没有返回值。虚空乐趣();不能定义void类型的普通变量,void a;//err无法判断分配了多少内存。可以定义void类型的指针,void * p;//ok对于指针,分配的内存大小是固定的。
void * p=NULL
printf(%d %d\n ,sizeof(*p),sizeof(p));//1 8
一个内存空间的编号,程序通过变量来申请和命名内存空间。
变量:名称、大小、范围、生命周期。
四个内存栈:系统分配空间,系统自动回收,函数中定义的变量,函数参数,函数结束,其内部变量的生命周期结束。堆:程序员动态分配空间,手动释放。全局区:全局变量和静态变量,分为初始化区和未初始化区,文本常量区和字符常量区。整个程序运行后,系统会自动回收。代码区内存四区模型图
1.在堆区手动回收。
操作系统恢复(程序结束)。
为了灵活起见,其他函数也可以使用变量。
地址自下而上递增。
数组buf,地址总是递增的,
2.栈区系统分配空间,离开作用域后自动回收。
为了效率。
地址从上到下递减。
3.全局区域3.1未初始化。
3.2初始化
3.3文本恒定区
4.代码区操作系统,编译器管理。
全球区域
#包含stdio.h
#包含stdlib.h
char *get_str1()
{
char * p= abcdef//文本常量区域
返回p;
}
char *get_str2()
{
char * q= abcdef//文本常量区域
返回q;
}
int main()
{
//堆栈区域
char * p=NULL//堆栈区域
char * q=NULL
p=get _ str 1();
printf(p=%s,p=%d\n ,p,p);
q=get _ str 2();
printf(q=%s,q=%d\n ,q,q);
/*
p=abcdef,p=4206628
q=abcdef,q=4206628
*/
返回0;
}
堆栈区
#包含stdio.h
#包含stdlib.h
#包含字符串. h
char *get_str()
{
char str[]= asdiajsdi ;//堆栈区域
返回字符串;
}
int main()
{
char buf[128]={ 0 };
//strcpy(buf,get _ str());//成功的情况可能是先复制语句,再释放堆栈空间。
//printf(buf=%s\n ,buf);//没有结果,不确定
char * p=NULL
p=get _ str();
printf(p=%s\n ,p);//p=(null)
返回0;
}
char str[]=" asdiajsdi ";//堆栈区,将文字常量区的字符串复制到堆栈区。
char * q=" abcdef//q指向文字常量区域。
char * buf=" asdas
buf[2]=" 2 ";//错误,文字常量区,内存不能修改。
char * buf[]=" dads ";//好的,堆栈区域
buf[2]=" 3 ";//修改堆栈区域的内容
#包含stdio.h
#包含stdlib.h
#包含字符串. h
char *get_str()
{
char str[]= asdiajsdi ;//堆栈区域;文字常量区的字符串将被复制到堆栈区。
返回字符串;
}
char *get_str2()
{
char * tmp=(char *)malloc(100);//堆区域
if (tmp==NULL)
{
返回NULL
}
strcpy(tmp, dadsdfsdg );
返回tmp
}
int main()
{
char buf[128]={ 0 };
//strcpy(buf,get _ str());
//printf(buf=%s\n ,buf);//没有结果,不确定
char * p=NULL
p=get _ str();
printf(p=%s\n ,p);//p=(null)
p=get _ str 2();
如果(p!=空)
{
printf(p=%s\n ,p);//p=dadsfdsfsdg
免费(p);
p=NULL
}
返回0;
}
将堆栈区的数据声明为全局,不会释放int *func()
{
int a;
返回a;//毫无意义。地址A的空间会被回收,即使返回地址也无法使用。
}//地址A不能使用,它存在于堆栈区,函数运行后会释放int *getA()。
{
静态int a=10//全局区域,内部
返回a;//您可以传递地址以使用。
}
,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。