C语言复习(一)——程序内存

因为寒假空闲时间比较多,加之今年疫情比较严重,所以就有时间把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类型

变量

变量的概念:

变量:既能读又能写的内存对象,称为变量。
常量:一旦初始化不能修改的对象称为常量。

变量的本质:

一段连续内存空间的别名。
程序通过变量向内存中读写数据。

修改变量的方法

  1. 直接
int a = 0;
a = 10 //直接修改
  1. 间接
#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;
}
发布了3 篇原创文章 · 获赞 3 · 访问量 393

猜你喜欢

转载自blog.csdn.net/qq_42689353/article/details/104327266