【校招 --阶段一 高级编程语言】语言基础

9 篇文章 0 订阅

一、指针及其应用
在C语言中指针是必不可少必须学到的,前边我们了解到每一个指针变量对应一个内存空间,没一个内存位置都定义了可使用&运算符访问的地址,他表示在内存中的一个地址。

#include<stdio.h.h>
int main(){
int var=100;
int *p;
p=&var
preintf("地址为%p",p);
return 0;
}

当上边代码编译后会产生以下结果:

地址: 0x7ffeeaae08d8

1)p是一个指针,存储着变量var的地址
2) 指针p的类型必须与变量var的类型一致,因为整形的指针只能存储在这些变量的指针地址中。

那么什么是指针?
指针就是内存地址.指针变量就是用来存储内存地址的变量。指针变量和其他变量一样,必须在使用前声明。
指针变量神明一般形式如下:

type *var

type就是指针变量的类型,var为变量的名称。*用来指定一个变量为指针。
以下为常用类型的指针变量:

int *var; //整形指针
double var;//double指针
float
var;//float指针
char *ch;//字符型指针

那么指针怎么使用?
指针常用操作有以下几个:定义一个指针变量、
把变量地量赋给指针。访问指针变量中可用地址的值。这些都通过*运算符来返回位于操作数所指定变量的值。

#include <stdio.h>
 
int main ()
{
   int  var = 20;    //实际变量的声明 
   int  *ip;         //指针变量的声明 
 
   ip = &var;  //在指针变量中存储 var 的地址 
 
   printf("var 变量的地址: %p\n", &var  );
 
  // 在指针变量中存储的地址 
   printf("ip 变量存储的地址: %p\n", ip );
 
 //使用指针访问值 
   printf("*ip 变量的值: %d\n", *ip );
 
   return 0;
}

以上代码结果如下:

var 变量的地址: 0x7ffeeef168d8
ip 变量存储的地址: 0x7ffeeef168d8
*ip 变量的值: 20

特殊指针NULL指针?
在指针变量沈明中如果没有给变量复制可以给指针变量付一个NULL。付为NULL值的指针被称为空指针。
NULL指针的地址为0.
在大多数操作系统上,程序不允许访问地址为0的内存,如果访问该内存会报NULL指针异常的错误,表明该块内存是一个不可访问的内存位置。
在此基础上除了一级指针还有二级指针,二级指针相当于二维数组。
除了在这介绍的指针还有与之相关的指针数组,指针函数,函数指针,指向指针的指针。
前边介绍过函数指针这里不做介绍。
二、C 预处理器
c 预处理器 是编译器的组成部分,他是编译过程中的一个步骤,他会在编译器编译之前完成所有的预处理。
预处理都是以#开头。#define就是一个预处理机。
下边列出一些比较重要的预处理命令:

#define 宏定义
#include 包含一个源代码文件
#ifdef 如果宏定义已经定义则返回一个真
#if 如果给定个条件为真,编译以下代码
#else #if的替代条件
#pragma 使用标准化条件,像编译器发布特殊的命令到编译器

例子:

#include<stdio.h>
#include"asse.h"

这个指令告诉编译器从系统中获取stdio.h并添加到当前程序中
第二个#include告诉编译器从本地文件中获取asse,h添加到当前程序中。

#define size 32

#define定义一个变量但是并未告诉编译器size的类型,只告诉编译器size的内容数据为32

#pragma warning(disable:4996)

在VS中scanf认为不是安全的解决方方法就是添加这样一行代码。或者加一个_s.

三、内存管理
C 为我们提供管理内存的几个函数。这些函数在头文件stdio.h下可以找到。

void *calloc(int num,int size)

在内存中分配num个长度为size的连续空间,并将每一个字节初始为0.所以他的结果是分配了num*size()个字节2长度内存空间,并且每个字节的值为0.

void free(void *addtress)

该函数释放address所指向的内存块,释放的是动态分配的内存空间。

void *malloc(int num)

在堆栈分配一块指定大小的内存空间,用来存放数据在函数执行期间该块内存不会被初始化,它们的值是随街的。

void *realloc(void *address,int newsize)

该函数重新分配内存,把内存分配到newsize

动态内存管理
在定义一个长度大小知道的数组很简单,但是定义一个知道大小的数组就不行了那么该怎么样办呢?
我们可以定义一个指针,这个指针指向一个未知的内存空间,后边在根据实际情况来动态分配空间。

#include<stdio.h>
intr main(){
int num[100]//首先定义一个数组大小为100的数组
char *newnize;//定义一个指向2未知内存的指针
newsize=char*malloc(200*sizeof(char))//动态为newsize分配空间

return 0;
}

上边代码中空间申请用的maloc也可以换成coloc来编写如下所示:

calloc(200, sizeof(char));

当动态分配内存时,您有完全控制权,可以传递任何大小的值。而那些预先定义了大小的数组,一旦定义则无法改变大小。

重新调整内存的大小和释放内存
当程序退出时,操作系统会自动释放所有分配给程序的内存,但是,建议您在不需要内存时,都应该调用函数 free() 来释放内存。

或者,您可以通过调用函数 realloc() 来增加或减少已分配的内存块的大小。让我们使用 realloc() 和 free() 函数,再次查看上面的实例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
   char name[100];
   char *de;
 

 
   /// 动态分配内存 
   de = (char *)malloc( 30 * sizeof(char) );

   // 假设您想要存储更大的描述信息 
   de= (char *) realloc( description, 100 * sizeof(char) );
 

 
   //使用 free() 函数释放内存 
   free(de);

四、内存泄露
什么是内存泄漏?

简单来说就是申请了一块内存空间,使用后完毕后没有释放掉。malloc申请资源后没有free释放。
那么内存泄漏怎么检查?

首先在申请了内存空间一旦使用完毕后首先要调用像函数释放空间。
将分配的内存指针以链表的形式自行管理,使用完毕后从链表中删除,程序一旦结束可以检查链表。
使用智能指针、使用一些常见的工具插件、入ccmalloc、LEaky。

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自首的小偷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值