C语言复习笔记

C语言复习笔记,第1张

参数地址空间

#include 
#include 

//1.形式参数:作用域仅限于该函数
//2.形式参数也是一个变量,局部变量,有自己的内存空间
    /* a.空间的生存期,出生和死亡
    何时申请了该空间
    当函数被调用的时候才申请了内存空间,才有了这个变量
    同时这个空间内的数据被赋值成实际参数的值,函数调用把实际参数的值拷贝一份给形式参数
    
    何时释放了该空间
        函数执行结束以后,该空间由内存管理单元自动回收“释放”
    */

void test ()
{
    //printf ("jinshu = %d\n",jinshu);
}

void buyRice2(int a)   //a 是一个局部变量,同时也是一个 1.形式参数,作用域仅限于该函数
{
    printf ("去买%d斤米。\n",a);   //如果错误提示中包含 3  4 说明你写了中文符号
    a++;
    printf ("jinshu = %d\n",a);
    printf ("buy中a的地址是%p\n",&a);
}


int main ()
{
    int a = 30; //30 我们称之为形式参数
   
    buyRice2(a);    //如果调用的函数带有参数,必须传参!!!
                    //调用的时候,传递的参数叫做实际参数,对格式没有要求,对数据类型严格要求
    printf ("main: a = %d\n",a);    //30
    printf ("main:a 的地址是%p\n",&a);
    system ("pause");
    return 0;
}


sizeof与strlen的区别

#include 
#include 

//计算字符串中字符的个数
//不能用sizeof来计算字符串中有效字符的个数!!!!!应该要用strlen,他在计算字符串大小的时候,遇到'/*
问题:
网络通信,获取的消息有乱码
协议,两端不匹配
*/'后,就结束计数!
int
main ()int
{
    [ a]= 1 {,2,3};printf
    ("数组中元素的个数:%d\n",sizeof()a/sizeof([a0]));char
    
    [ array]= "hello" ;printf
    ("字符串中元素的个数:%d\n",sizeof()array/sizeof(char));char
    
    [ array2]= "hello" ;printf
    ("求字符串中元素的个数用strlen,%d\n",strlen()array2);system
    ("pause");return
    0 ;}
#

typedef关键字

include# 
include/*
typedef
typedef为c语言的关键字
作用是为一种数据类型定义一个新名字。
这里的数据类型包括内部数据类型(int char等)和自定义的数据类型(struct等)

和struct来匹配为了代码编写简洁
和普通类型匹配,通过名字来获取一些信息
*/ 

//在单片机开发,寄存器为8位 16位 32位
typedef

unsigned char ; u_int8//(0,255)   typedef
unsigned short int ; u_int16typedef
unsigned int ; u_int32typedef

struct student int
{
    ; scorechar
    * ;namevoid
    (*)p(structstudent ) stu;}
,STU*;PSTUtypedef

struct Node int
{
    ; datastruct
    Node *; next}
,NODE*;PNODEint


main ()=
{
    u_int8 data 10 ;unsigned
    short int = data2 20 ;=
    u_int16 data3 30 ;=
    u_int32 data4 40 ;;

    STU stu1.
    stu1=score 100 ;printf
    ("score=%d\n",.stu1)score;;

    PSTU pstu=
    pstu ( )PSTUmalloc(sizeof()STU);=
    pstu->score 99 ;printf
    ("score2=%d\n",)pstu->score;struct

    student * ;pstu3=
    pstu ( structstudent * )malloc(sizeof(structstudent ));=
    pstu->score 98 ;printf
    ("score3=%d\n",)pstu->score;printf

    ("%d,%d,%d,%d",,data,data2,data3)data4;system


    ("pause");return
    0 ;}
#

for循环

include# 
includeint 
main ()int
{
    ; scoreint
    ; i//循环的初始条件  //while(1);  死循环
            //for (;;);         死循环
            //第二种循环  for循环
            //初始条件   当不满足此条件,不执行
            // i++  条件发生改变
            for
    ( =i 0 ;< i 10 ;++ i )//强调分号,分号不能掉,记住格式 for(i = 0; i < 10; i ++){  //i = i + 1;  //条件发生改变
        //提示输入成绩

        printf
        ( "请输入第%d次成绩:\n",+i1);//不改变原始次数    //获取用户输入

        scanf
        ( "%d",&)score;//判断

        if
        ( 90<=) scoreprintf{
            ( "成绩优秀\n");}
        else
        if ( 70<= && score < score 90 )printf{
            ( "成绩良好\n");}
        else
        if ( 60<= && score < score 70 )printf{
            ( "成绩及格\n");}
        else
        if ( 40<= && score < score 60 )printf{
            ( "成绩不及格\n");}
        else
        printf{
            ( "很差劲,退学吧\n");}
        }

    return
    0 ;system
    ( "pause");}
#


数组100的和

include# 
includeint 

main ()int
{
    ; iint
    [ array100];//定义了能放置100个数据的数组 int
    = sum0;for
    
    (=i1;<=i100;++i)[{
        array-i1]=;i} 
        //赋值,获取1到100变量的数值   for
    
    (=i0;<i100;++i)+={
        sum[array]i;}
    printf
    
    ("1到100的和是:%d\n",)sum;system
    ("pause");return
    0 ;}
#

函数数组

include# 
include//第一个参数是数组的首地址,第二个参数是数组的个数 


            void
arrayPrint (int[ datas],int ) cnt//形式参数中,虽然写的是一个参数的样子,中括号[]中数组的大小是无效的!!!!!   //这里不管中括号中写多少,都不能代表形参数组有多大1
{                               //这里的中括号的作用仅仅用来表示,该参数是一个地址,在windows中用4个字节来表示地址,在Linux64位中用8个字节表示。
                                int
    ; ifor
    (=i0;<i;cnt++ i)printf{
        ("%d ",[datas]i);}
    putchar
    ('\n');//putchar 输出一个字符   getchar获取一个字符的输入,当时用于过滤回车  }
void
noparams ()printf
{
    ("xxx\n");}
void

hasparams (int, aint , bchar ) cprintf
{
  ("a=%d,b=%d,c=%c\n",,a,b)c;}
int

main ()int
{
    [ array6]= 11 {,22,35,44,55};printf
    ("数组的大小是:%d\n",sizeof()array);printf
    ("array数组元素的个数为%d个\n",sizeof()array/sizeof([array0]));//noparams();
    //hasparams(1,2,'c');
    //hasparams(array[0],array[1],'a');
    //两种方式来传参
    arrayPrint
    (,arraysizeof ()array/sizeof([array0]));arrayPrint
    (&[array0],sizeof ()array/sizeof([array0]));//1.数组和函数结合,数组名当作实际参数


    int

    [ a3];//一个整型数占用空间4个字节,3个占用空间12个字节   char
    [ b3];//一个char型占用空间1个字节,3个占用3个字节  printf

    ("a数组的大小是:%d\n",sizeof()a);printf
    ("b数组的大小是:%d\n",sizeof()b);printf
    ("一个整数的空间是%d\n",sizeof(int));printf
    ("一个字符型数的空间是:%d\n",sizeof(char));//两个数组有什么相同,不同

    //相同:数组元素个数为3
    //不同:1.数组类型不同。2.数组的类型大小不同
    //问:如何计算数组中元素的个数。 数组的总大小/一个类型的大小

    printf

    ("a数组有%d个元素\n",sizeof()a/sizeof([a0]));//sizeof(a)/sizeof(int);printf
    ("b数组有%d个元素\n",sizeof()b/sizeof([b0]));//sizeof(b)/sizeof(char);system


    ("pause");return
    0 ;}
#

函数指针

include# 
includevoid 

printWelcome ()printf
{
    ("欢迎你哦\n");}
int

add (int, aint) breturn
{
    + a;b}
int


main ()//1.如何定义一个函数指针!
{

    void
    ( *)p();//1.如何表示指针:* 2.如何知道是函数:() 3.函数指针是专用的,格式很强(参数类型,个数,返回值),就像数组指针一样。    //2.如何给函数指针赋值
    =
    p ; printWelcome//函数就是地址,就像数组一样,数组名就是地址   //3.如何通过函数指针调用函数

    p
    ();//直接通过指针名字+()    (
    *)p();//取内容 (*指针名字) int

    ( *)padd(int, aint) b;=
    padd ; add//调用函数
    //int ret = padd(1,2);
    int
    = ret ( *)padd(1,2);printf

    ("ret=%d\n",)ret;system


    ("pause");return
    0 ;}
#

函数和数组的综合应用

include# 
includevoid 


initScores (int* ,datasint) sizeint
{
    ; ifor
     (=i0;<i10;++i)//2.1 提示用户输入第多少个数{
        printf
        ("请输入第%d个学生的成绩:",+i1);//2.2 获取用户输入的scanf
        scanf
        ("%d",)datas;if
        (*100datas>|| * <datas0)printf{
            ("哪里有这种成绩\n");printf
            ("强制退出,该程序不给xx用\n");system
            ("pause");exit
            (-1);}
        ++
        datas;}
    }
void


printScores (int* ,datasint) sizeint
{
    ; ifor
    (=i0;<i;size++i)printf{
        ("第%d个学生的成绩是:%d\n",+i1,*++datas);}
    }
int
getMax (int* ,datasint) sizeint
{
    ; data1int
    ; i=
    data1*;datasfor
    (=i0;<i10;++i)if{
        (<data1 * )datas={
        data1 * ;datas}
        ++
        datas;}
    return
    ; data1}
int

getMin (int* ,datasint) sizeint
{
    ; data2int
    ; i=
    data2*;datasfor
    (=i0;<i10;++i)if{
        (*data2 > )datas={
        data2 * ;datas}
        ++
        datas;}
    return
    ; data2}
float

getAverage (int* ,datasint) sizeint
{
    ; iint
    = total 0 ;float
    ; averagefor
    (=i0;<i10;++i)+={

       total*;datas//total = total + scores[i];
       }
    printf
    ("总成绩为%d\n",)total;//5.2 算平均值
        =
    average ( float)/total10;return
    ; average}
void

printRet (int, data1int , data2float) data3printf
{
    ("最高分%d  最低分%d  平均值%f\n",,data1,data2)data3;}
int


main ()int
{

    [ scores10];int
    ; lenint
    ; maxint
    ; minfloat
    ; average=


    len sizeof ()scores/sizeof([scores0]);//1.初始化数组



    initScores
    (&[scores0],)len;//函数调用中,传参就是一个赋值的过程,实际参数的值,给形式参数。 //1.5 打印数组
    printScores
    (&[scores0],)len;//2.找到最高分
    =
    max getMax (,scores)len;//3.找到最低分
    =
    min getMin (,scores)len;//4.算出平均分
    =
    average getAverage (,scores)len;//5.输出结果
    printRet
    (,max,min)average;system

    ("pause");return
    0 ;}
#

数组指针

include# 
include//"指针数组"是多个指针 

//"数组指针"是一个指针
int
main ()int
{
    [ a3]= 1{,2,3};int
    
    ( *)p[ 3];//数组的指针,强调的是类型,数组的个数,偏移值是偏移了整个数组的大小   =
    p ; aint
    
    * ;p2=
    p2 ; aprintf
    
    ("数组的地址是:%p\n",)a;printf
    ("数组的地址是:%p\n",&[a0]);printf 
    ("p数组的地址是:%p\n",)p;//0060FF18    //0060FF0C  - = 12
                                        //0060FF10
                                        
                                        //0060FF0C  - = 4
                                        printf
    ("p2数组的地址是:%p\n",)p2;printf
    
    ("================区别来了================\n");printf
    
    ("p++的结果是:%p\n",++)p;printf
    ("p2++的结果是:%p\n",++)p2;/*
    int *p; //此指针并非是数组指针,仅仅是一个普通的整型数的指针,刚好指向了数组的首元素地址a &a[0]
    p = a;
    p = &b;
    int i;
    for(i=0;i<3;i++){
        printf("%d \n",*p++);
    }
    */
    system
    
    ("pause");return
    0 ;}
#

为什么要用指针

include# 
include/*为什么要用指针*/ 

//1.能不能让a(10),强制保存在我要的地址 0060ff00  10   java 做不到

int

main ()int
{   
    ; a//a的地址肯定是系统随机分配的  =
    a 10 ;int
    
    * ;p=
    p & ;aprintf
    
    ("a address is %p\n",)p;int
    
    * =p2 ( int* )0x0060ff00;//int a=10  ARM架构 裸机编程 ARM驱动  *
    =p2 10 ;printf
    ("在内存的%p位置,存放值是%d\n",,p2*)p2;volatile
    
    int * =p3 ( volatileint * )0x0060ff00;//类型修饰符volatile是一个类型修饰符,作用是作为指令关键字,一般都是和const对应,确保本条指令不会被编译器的优化而忽略;const修饰的变量是不可被更新,去掉变量类型,const后面跟着什么,说明后面的这个就是不可变的  system
    ("pause");return
    0 ;}
#

结构体的定义和使用

include# 
include//struct 关键字 
//1.结构体的定义和使用,!!!!!提醒:新手容易忘记在结构体}后面带上;
//2.如何访问结构体: 目标,内部的变量
struct

student //自定义的类型  int
{
    ; scores//特性:分数         char
    [ name128];//特性:名字     int
    ; xueHao//特性:学号         void
    ( *)pintroduce( char* )pname;//行为:函数指针(自我介绍)   }
;int

main ()//类型   变量名           初始值
{
    int
    =      a  0               ;struct
    student = stu1 98 {,"11",2019700002};printf
    ("结构体:scores=%d\n",.stu1)scores;printf
    ("结构体:name=%s\n",.stu1)name;printf
    ("结构体:xuaHao=%d\n",.stu1)xueHao;struct

    student =  aa 99 {,"22",2019766666};printf
    ("结构体:scores=%d\n",.aa)scores;printf
    ("结构体:name=%s\n",.aa)name;printf
    ("结构体:xuaHao=%d\n",.aa)xueHao;struct

    student ; test.
    test=scores 99 ;strcpy
    (.test,name"33");.
    test=xueHao2019777777;printf
    ("结构体:scores=%d\n",.test)scores;printf
    ("结构体:name=%s\n",.test)name;printf
    ("结构体:xuaHao=%d\n",.test)xueHao;system

    ("pause");return
    0 ;}
#

结构体是不难的

include# 
include/*
结构体里面的那些东西,都是我们熟悉的东西,千万不要因为被一个结构体框起来以后就不知所措了。
旧的知识,新的用法!!!!!!!!
*/ 

void
func (int) dataprintf
{
    ("函数:data = %d\n",)data;}
struct


datas int
{
    ; achar
    ; cfloat
    ; fdouble
    ; dchar
    [ str128];void
    ( *)p(int) data;//指针函数*p    }
;/*
struct student
{
    char *name;
    char sex;
    int num;
    float scores;
    char *address;

    void (*peat)();
    void (*introduce)(char *name,char *address,char sex,int num);
};
*/

int
main ()int
{
    = a 10 ;printf
    ("a = %d\n",)a;char

    = c 'M' ;printf
    ("c = %c\n",)c;float

    = f 1.2 ;printf
    ("f = %f\n",)f;double

    = d 3.4 ;printf
    ("d = %lf\n",)d;//char *str = "陈立臣"; //初始化可以直接使用指针变量指向该字符串

    char
    * ;str=
    str ( char*)malloc(128);//malloc用于开辟一个空间用来存放字符串   memset
    (,str','128);//初始化=   "huyu"
    str ; puts(
    );strvoid(

    * )(pint)= data; p func(
    10);puts(

    "============================================");structdatas

    ; . d1=
    d1100a ; .=
    d1'M'c ; .=
    d11.2f ; .=
    d123.44d ; strcpy(
    .,d1"陈立臣"str);//strcpy函数是将一个字符串的全部内容(包括'.')拷贝到另一个字符串里=	;
    d1printfp(func"结构体:a=%d\n"

    ,);printfa("结构体:c=%c\n"
    ,);printfc("结构体:f=%f\n"
    ,);printff("结构体:d=%lf\n"
    ,);putsd(.
    );d1.strp(
    d110);//10是参数system(	"pause"

    );return0;
    } #include
#

结构体学生成绩例子

includestruct 
Studentint 

; char
{
    * score;
    //4字节,linux中8字节 }name;int
main(
) int;struct
{
    Student i[
    3 ] stu;//找最高分:人structStudent
    ;
    struct Student maxStu;
    for ( minStu=

    0;i<sizeof(i)/sizeofstu([0]stu);++)printfi("请输入第%d个学生的名字:\n"{
        ,+1)i;[].
        stu=i(charname * )malloc (128);scanf("%s"
        ,[].stu)i;printfname("请输入第%d个学生的成绩:\n"
        ,+1)i;scanf("%d"
        ,&[].stu)i;}scorefor(
    =

    0;i<sizeof(i)/sizeofstu([0]stu);++)printfi("第%d个学生的名字和分数:"{
        ,+1)i;printf("%s:%d\n"
        ,[].stu,i[]name.stu)i;}score==
    [


    maxStu 0 minStu ]stu;//初始化以便后面做判断for(    =
    0;i<sizeof(i)/sizeofstu([0]stu);++)ifi(.{
        <[maxStu]score.stu)i=[score]{
            maxStu ; stu}iif(
        .
        []minStu.score>stu)i=[score]{
            minStu ; stu}i}printf
        (
    "考最高分的是:%s:%d\n"

    ,.,.maxStu)name;maxStuprintfscore("考最低分的是:%s:%d\n"
    ,.,.minStu)name;minStusystemscore("pause"

    );return0;
    } #include
#

结构体中常犯的错误

include//char : 1    int :4    short : 2    unsigned int : 4    long : 8    unsigned long : 8    long long : 8     float : 4    double : 8    指针 : 8 
structDatas 
char
* ;
{
    //注意内存空间,容易犯错,占8字节 }p;    struct
    
Testchar

[ 128
{
    ] p;};int
main(

) structDatas;
{
    . = d(

    dcharp * )malloc(128);//开辟一个空间存放,堆memset(   .
    ,','d128p);//初始化strcpy(.   ,
    "感觉自己萌萌哒")d;p//在linux 中段错误printf("%s\n"  ,
    .);printfd(p"%d\n",
    sizeof(structDatas)); system("pause")
    ;return0;}
    # include#
include

结构体指针

structstudent 
int; 

//1.如果要用结构体指针,就不能用!!点运算符!!!访问结构体中的变量要用->
char [
{
    128 score]
    ; name};intmain
()
struct student;.
{
    = 100 Test;
    Teststrcpyscore ( .,
    "张三")Test;nameprintf("%s:%d\n",
    .,.)Test;namestructTeststudentscore*;
    
    //野指针,要避免野指针的出现 = (pstruct  student
    //p.score = 100;    //如果用结构体指针,就不能用点运算来访问结构体中的变量,要用->
    p * )malloc ( sizeof(structstudent)); =98;strcpy
    p->score(,"李四"
    );p->nameprintf("%s:%d\n",
    ,);freep->name(p->score);
    
    =&p;//指针是存放地址的变量,之前18行是指向malloc的那块空间,现在指针变量存的是Test的地址
    p printf (Test"地址是:%p\n"  ,
    
    ++);printfp("加加后的地址是:%p\n",
    );system(p"pause")
    
    ;return0;}
    # include#
include

结构体指针玩学生成绩

structstudent 
int; 

char *
{
    ; score}
    ; intnamemain
()

int ;int=
{
    0 i;
    printf len ("请输入总人数:\n")
    ;scanf("%d",
    &);structstudentlen*=
    
     ( struct studentp * )malloc ( *sizeof(structlenstudent)); for(=0
    ;<i;++)iprintflen(i"请输入名字:\n"){
        ;=(char*
        p->name ) malloc( sizeof(128));scanf("%s",
        );printf(p->name"请输入成绩:\n")
        ;scanf("%d",
        &());++p->score;}=
        p-;
    for
    
    p ( p = len0
    ;<i;++)iprintflen(i"学生成绩为:%s:%d\n",{
        ,);++p->name;p->score}system
        p("pause"
    )
    /*struct student test[5];           //两种写法都对
    struct student *p = test;
    for(i=0;iname = (char *)malloc(sizeof(128));
        scanf("%s",p->name);
        printf("请输入成绩:\n");
        scanf("%d",&(p->score));
        p++;
    }
    
    p = test;
    for(i=0;iname,p->score);
        p++;
    }
    */
    
    ;return0;}
    # include#
include

结构体指针综合应用

structstudent 
int; 

char *
{
    ; score}
    ; structnamestudent
*initStuScores

( int) int;struct lenstudent
{
    * i=
    ( struct studentp * )malloc ( *sizeof(structlenstudent)); for(=0
    ;<i;++)iprintflen(i"请输入名字:\n"){
        ;=(char*
        p->name ) malloc( sizeof(128));scanf("%s",
        );printf(p->name"请输入成绩:\n")
        ;scanf("%d",
        &());++p->score;}=
        p-;
    return
    p ; p } lenvoid
    printfMes p(
struct

student *,int )int p;for len(
{
    = i0
    ;<i;++)iprintflen(i"学生成绩为:%s:%d\n",{
        ,);++p->name;p->score}}
        pstructstudent
    *
findMaxStu

( structstudent *,int )int p;struct lenstudent
{
    * i;
    = ; formax(
    max = p0
    ;<i;++)iiflen(i<){
        =;max->score } p->score++ {
            max ; p}
        return 
        p;}
    struct
    student max*
findMinStu

( struct student*,int )int p;struct lenstudent
{
    * i;
    = ; formin(
    min = p0
    ;<i;++)iiflen(i)={
        ;}min->score > p->score++ {
            min ; p}
        return 
        p;}
    float
    getAverage min(    
struct

student *,int )int p=0 len;
{
    int total ; for(
    = i0
    ;<i;++)i+=len;i++;{
        total } p->scorereturn
        p(float
    )
    / ;}inttotalfindStudentForNamelen(
struct

student *,int , charp*) lenint; forname(
{
    = i0
    ;<i;++)iiflen(istrcmp({
        ,)==0name)p->namereturn1;}{
            else return0
        ;}{
        ++ ;}
        }
        pintmain
    (
)
int ;int=
{
    0 i;
    printf len ("请输入总人数:\n")
    ;scanf("%d",
    &);structstudentlen*=
    
    NULL ; structmax student *=
    NULL ; structmin student *=
    initStuScores () pstu ; printfMes(len,)
    ;=pstufindMaxStulen(,
    
    max ) ;=pstufindMinStulen(,
    min ) ;printfpstu(len"max:%s:%d\nmin:%s:%d\naverage:%f\n",
    ,,,,max->namegetAveragemax->score(min->name,min->score));pstuiflen(findStudentForName(
    ,,"zhangsan")pstu==len-1)printf("没有此人\n"){
        ;}elseprintf(
    "恭喜你,找到了\n"){
        ;}system("pause"
    )
    
    ;return0;}
    # include#
include

面试宝典结构体

//一、结构体成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)//二、结构体大小必须是所有成员大小(数组除外,结构体除外)的整数倍 
//对齐方式确实很浪费空间。。。。可是按照计算机的访问规则,这种对齐方式提升了效率struct 

s1
char
;

//1 char{
    ; ch1//1   int
    ; ch2//4 遵循结构体法则第一条,偏移量必须是当前成员的大小整数倍,逻辑偏移2 实际按照对齐的规则,要偏移成4   }
    ; istruct  s2
char;

//1 int{
    ; ch1//4+3   char
    ; i//1+3  }
    ; ch2struct   s3
char;

//1 int{
    ; ch//4+3    char
    [ i12  ]
    ; str//20};structs4
char;

//1 int{
    ; ch1//4+3   struct
    s i//16  char
    ; //1{   int
        ; ch2//4+3   double
        ; j//8       }
        ; dfloat   ;
    //32stmp}
    ; fstruct    s5
char;

int ;{
    union chchar
    ; iint
    ;{
        //取最大项4 ch1}
        ; j//12}
    ;#  pragma
pack(

4) //指向4对齐,最大是8structs6char ;
int ;{
    float ch;
    //4 idouble
    ; f//20}
    ; d#   pragma
pack(

10) structs7char;
int ;{
    float ch;
    //12 idouble
    ; f//20    }
    ; dint   main
()

printf ("char%d\n",
{
    sizeof(char));//1printf("float%d\n"	,
    sizeof(float));//4printf("int%d\n"	,
    sizeof(int));//4printf("double%d\n"	,
    sizeof(double));//8printf("s1:%d\n"	,
    
    sizeof(structs1)); //8printf("s2:%d\n"	,
    sizeof(structs2)); //12printf("s3:%d\n"	,
    sizeof(structs3)); //20printf("s4:%d\n"	,
    sizeof(structs4)); //32printf("s5:%d\n"	,
    sizeof(structs5)); //12printf("s6:%d\n"	,
    sizeof(structs6)); //20printf("s7:%d\n"	,
    sizeof(structs7)); //20system("pause"	)
    ;return0;}
    # include#
include

无类型指针,内存泄漏解决方法

intmain 
() 
//int a[3]; /*
    int *a = (int *)malloc(3*sizeof(int));  //也是数组
    int i;
    for(i=0;i<3;i++){
        a[i] = i;
    }
    for(i=0;i<3;i++){
        printf(" %d ",a[i]);
    }
    *//*
    避免内存泄露
    
    1.程序刚跑起来很好,跑几个小时或者几天,程序崩溃
    whike(1){
        sleep(1);
        int *p = malloc(1024);  malloc申请的空间,程序不会主动释放,Linux的话,程序结束后,系统会回收这个空间
        如何避免:
        1.注意循环中有没有一直申请
        2.及时合理的释放    free(p); p=NULL;//不让p成为野指针
        
        int p;
        p = NULL;
        
        int a = 0;
        int sum = 0;
    }
    
    */int
{
    ;
    printf
    
    (
    
    "请输入你整型数组的元素总个数\n" n)
    ;scanf("%d",
    &);printf(n"n = %d\n",
    );//int parray[n];  //4种方式,3种合法,这种教材说非法intn*=
    (
    
    int *parray ) malloc( *sizeof(intn));//数组if(== NULL
    )printfparray ( "开辟空间失败!\n"){
        ;}int;for
    (
    
    = i0
    ;<i;++)iprintfn(i"请输入第%d个学生的成绩:",{
        (+1))i;scanf("%d",
        &[]);parray}ifor(=
    0
    
    ;<i;++)iprintfn(i"第%d个学生的成绩是:%d\n",{
        (+1),i*++);}parraysystem("pause"
    )
    
    
    ;return0;}
    # include#
include


指针收官,如何定义

intmain 
() 
int ;//定义整型变量i;int
{
    * i;  //定义p为指向整型数据的指针变量
    int [p5 ]
    
    ; array//定义整型数组a,他有5个元素int*[   4
    
    ] ;p//定义指针数组p,它由4个指向整型数据的指针元素组成  指针数组int(*  )
    
    [ 4]p;//p为指向包含4个元素的一维数组的指针变量   数组指针intf(  )
    ; //f为返回整型函数值的函数int*p    (
    
    ); //p为返回一个指针的函数,该指针指向整型数据int(*  )
    ( );p//p为指向函数的指针,该函数返回一个整型值 int** ;
    //p是一个指针变量,它指向一个指向整型数据的指针变量     //二级指针 void*p;    //p是一个指针变量,基类型为void(空类型),不指向具体的对象
    system (p"pause"    )
    
    ;return0;}
    # include#
include

字符串的 *** 作

intmain 
() 
char *="哞哞"
{
    ; putsstr ( );
    printf(str"%s\n",
    );//char pstr[128] = {'char'};  //1.申请空间 2.初始化,把每个元素都初始化为'*';str//野指针,造成非法内存访问,会出现段错误  cmd窗口闪退=
    
    (
    char *pstr) malloc
    pstr ( 128);//1.申请了空间 2.一旦用了malloc,一定要注意内存泄漏问题。3.malloc可能会失败,要对返回值做判断if(==NULL)  printf
    ("申请内存失败!"pstr ) ;exit{
        (-1);
        }memset(,','128
    )
    ;//初始化,把每个元素都初始化为'//三个要素1.params 参数,初始化的对象 2.初始化成什么字符 3.多大'pstrprintf("请输入字符串\n");//scanf("%d",pstr);  gets
    (
    
    );puts()
    ;
    system(pstr"pause")
    ;returnpstr0;
    
    
    }#include#include
    int main(
)

字符串api

//char* strcpy(char* dest, const char *src);char 
*; 
= (char*
{
    )
    malloc (strDest128
    strDest ) ;memset (,','128);//初始化,防止*strDest成为野指针
    char*strDest="胡宇 胡宇";strcpy(,   )
    
    ; //字符串复制函数strSrc puts ()
    
    ;strcpystrDest(strSrc,"huyu" )
    ;putsstrDest()
    
    ;memsetstrDest(,','sizeof
    ()strDest/sizeof
    
    ([strDest0]));strDest//重置strncpy(,strDest"clc hs",3);//char* strncpy(char *destinin,char *sourse,int maxlen);    //可选择复制的元素个数    puts
    ()strDest;char[ 128]=   "追西西科技 "
    ;strcatstrDest(,
    
    ) test;//追加在一个字符串的后面puts ( );
    char*test=strSrc"123";    char
    *=test"123";
    
    int =str1 strcmp (,
    ) ;str2 printf ("ret = %d\n"
    
    , ret ) ;ifstr1(str2==0    //字符串的比较,str1str2 ret=1, str1=str2 ret=0
    )printf("两个字符串一样!\n"ret);
    }ifret(!strcmp{
        (,))//!非0
    printf
    
    ("两个字符串一样!\n");}str1systemstr2("pause"{ )
        ;return0;}
    #
    
    
    include#include#include
    /*
函数原型:
1
 char *strstr(char *str1, const char *str2);
语法:
1
* strstr(str1,str2)
str1: 被查找目标 string expression to search.
str2: 要查找对象 The string expression to find.
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。
*/ /*
strlwr()用于将字符串中的字符转换为小写,其原型为:
    char *strlwr(char *str);

【参数说明】str为要转换的字符串。

【返回值】返回转换后的小写字符串,其实就是将str返回。

strupr作用相反,用法一样
*/int
main

字符串api2

() 
char* 
="chenlichen"
/*
    函数原型
char *strchr(const char *str, int c)
参数
str-- 要被检索的 C 字符串。
c-- 在 str 中要搜索的字符。
功能
在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置。
返回值
返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针。 [2] 
头文件
#include */

;
char
* =NULL;
{
    /*
    p = strchr(str,'i');
    if(p == NULL){
        printf("没有找到\n");
    }else{
        Printf("找到\n");
    puts(p);
        
    }
    */ /*
    char *substr = "li";
    
    p = strstr(str,substr);
    if(p == NULL){
        printf("没有找到\n");
    }else{
        printf("找到\n");
        printf("%s\n",p);
        puts(p);
    }
    
    char str1[] = "Hello Word"; //windows环境下 要定义成数组的形态,否则崩溃,Linux环境下可以用指针的
    puts(strlwr(str1));
    puts(strupr(str1));
    */str //strtok字符串的分割 char *strtok(char *strings,const char *tokseps);chen,li,chen; char[
    ] =p "chen1,li,chen2,hu,yu" ;int
    =
    1
    
    
    ;
    char str2*[ 10 ];
    
    = i strtok (,
    "," )psubs;if(!=
    p NULL )printfstr2("第%d个字符串:%s\n",,
    );p [ -1{
        ]=;}iwhilep(1
        psubs)i=strtok( NULL p,
        ","
    );if({
        
        p != NULL)printf("第%d个字符串:%s \n",++
        
        ,)p ; [-{
            1]=;}ielsepprintf(
            psubs"没有子串了\n"i);break ; p}
        }int{
            ;for(=0
            ;<
        ;
    ++
    ) jputs
    ([j]);j}isystemj("pause"{
        );psubsreturnj0;}
    
    
     


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/3002622.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-09-27
下一篇2022-09-27

发表评论

登录后才能评论

评论列表(0条)

    保存