因为寒假空闲时间比较多,加之今年疫情比较严重,所以就有时间把C语言重点与难点复习一遍。
数据类型
概念
- 类型是对数据的抽象。
- 类型相同的数据具有相同的表示形式、存储格式以及相关的操作。
- 程序中使用的数据类型必定属于某一种数据类型。
如下图示
这张图片展示了C语言中的数据类型。
数据类型的本质:固定大小内存块的别名。
数据类型的作用:编译器预先为变量分配的内存大小。
数据类型的大小:sizeof()
sizeof是操作符,不是函数,sizeof测量的实体大小在程序编译的时候就已经确定。
下面举一个简单的例子:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 1;//告诉编译器分配4个字节大小的内存空间
int b[10];//告诉编译器分配40个字节大小的内存空间
printf("sizeof(a):%d\n", sizeof(a));
printf("b:%d\n&b:%d\nb+1:%d\n&b+1:%d", b, &b, b + 1, &b + 1);
system("pause");
return 0;
}
该程序运行结果如下:
我们会发现:
b和&b的结果是一样的,但是b+1和&b+1的结果是不一样的,这是因为b和&b代表的数据类型是不一样的。
b代表的是数组首元素的地址,而&b代表的是整个数组的地址。
数组也是一种数据类型。
数据类型的封装
void
-
void的字面意思是“无类型”,而void *则为无类型指针,void * 可以指向任何类型的数据
-
用法1:数据类型的封装:
int f(void * i);
典型的如内存操作函数memcpy和memset; -
用法2:void 修饰函数返回值和参数:
如果函数没有返回值,则应将其函数返回值声明为void,
如果函数没有参数,则应将器函数参数声明为void。 -
void 指针的意义
C语言规定只有相同类型的指针才可以相互赋值,
void *指针作为左值用于用于接收任意类型的指针,
void *指针作为右值赋值给其他指针时需要强制类型转换。
int a = 2;
int *p1 = &a;
void *p2 = NULL;
p2 = p1;
char *p4;
p4 = (char *)malloc(100);//malloc()函数返回值时void *l类型
变量
变量的概念:
变量:既能读又能写的内存对象,称为变量。
常量:一旦初始化不能修改的对象称为常量。
变量的本质:
一段连续内存空间的别名。
程序通过变量向内存中读写数据。
修改变量的方法
- 直接
int a = 0;
a = 10 //直接修改
- 间接
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int a = 10;
printf("a = %d\n&a = %d\n", a, &a);
int *p;
p = &a;//通过内存修改
*p = 200;
printf("a = %d\n&a = %d", a, &a);
system("pause");
return 0;
}
程序的内存四区模型
常量区:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *getstr1()
{
char *p1 = "abcdefg";
return p1;
}
char *getstr2()
{
char *p2 = "abcdefg";
return p2;
}
int main(void)
{
char *p1 = NULL;
char *p2 = NULL;
p1 = getstr1();
p2 = getstr2();
printf("p1:%s p2:%s\n", p1, p2);//打印p1,p2所指向内存空间的数据
printf("p1:%d p2:%d\n", p1, p2);//打印p1,p2的值
system("pause");
return 0;
}
堆栈区:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *getm(int number)
{
char *p;
p = (char *)malloc(sizeof(char)*number);
if (p==NULL)
{
return NULL;
}
else
{
return p;
}
}
int main(void)
{
char *p = NULL;
p = getm(10);
if (p==NULL)
{
return 0;
}
strcpy_s(p,10,"112233");
printf("%s\n", p);
printf("%d\n", p);
system("pause");
return 0;
}