zoukankan      html  css  js  c++  java
  • 结构体,内存,指针例题.DOC

    2015.1.30

    递归函数:1.自身调用自己;2.要有结束条件!
    typedef 后面加分号;一般后面的重定义名加_,例如:typedef unsigned long int uint_16;
    结构体成员存放是不重叠的,但是结构体变量内存会重叠,可以节省内存空间!

    字节对其对cpu运行效率有影响。底层的时候要注意这个问题
    有效对齐:min(自身对齐,指定对齐)
    结构体自身对齐:max(成全自身对齐)
    圆整:结构体自身对齐 % 有效对齐 == 0;

    int a[10] = {。。。。} 后面的是初始化表,结构体初始化也需要加{},并且可以嵌套:{。。。{}。。}

    体会下面的代码中flag的用法,挺好的:将指针p指向的数组中的字符间隔输出,

    while(*p)
    {
    if(flag)
    {
    printf("%c",*p);
    }
    flag = (flag + 1) % 2;
    p++;
    p
    }

    遍历一个3行4列的二维数组求和的一个方法:
    int array[3][4]={...};
    int *pa[3] = {array[0],array[1],array[2]}
    for(i = 0; i < 3; i++)
    {
    for(j = 0; j < 4; pa[i]++)
    {
    sum += *pa[i];
    }
    }

    #include <stdio.h>
    #define LEN 80
    int main()
    {
    char str[LEN],*p;
    int array[LEN/2],value = 0,n = 0;
    int begin_count = 0;

    gets(str);
    p = str;
    while(*p)
    {
    if((*p > '0') && (*p <= '9'))
    {
    begin_count = 1;
    value = value*10 + *p - '0';
    }
    else
    {
    if(begin_count == 1)
    {
    array[n++] = value;
    begin_count = 0;
    value = 0;
    }
    }
    p++;
    }
    if(begin_count == 1)
    {
    array[n++] = value;
    }
    for(value = 0; value < n; value++)
    {
    printf("%d",array[value]);
    }
    printf(" ");

    return 0;
    }

    上面题型的第二个版本:(从中间开始写)
    while(*p)
    {
    if((*p > '0') && (*p <= '9'))
    {
    value = value*10 + *p - '0';
    p++;
    while((*p > '0') && (*p <= '9'))
    {
    value = value*10 + *p - '0';
    p++;
    }
    array[n++] = value;
    value = 0;
    continue; //注意这里coutinue的用法
    }
    p++;
    }

    结构体变量的声明需要注意下面这种情况:

    下面两个声明被编译器当做两种截然不同的类型,即使他们的成员名完全相同:

    struct{
    int a;
    char b;
    float c;
    } x;

    struct{
    int a;
    char b;
    float c;
    }y[20],*z;

    z = &x 注意了:这个操作是非法的。(要想使这个表达式成立,需要给结构体加上标签(tag)或者用typedef,看下面)
    方法一:
    struct SIMPLE{
    int a;
    char b;
    float c;
    };

    struct SIMPLE x;
    struct SIMPLE y[20],*z;

    方法二:
    typedef struct {
    int a;
    char b;
    float c;
    } simple;

    simple x;
    simple y[20],*z;

    下面的定义注意两点:1.s不一定就在寄存器中2.不可对s取地址。(取地址是相对内存而言的)
    register int s; //s可能在寄存器中也可能在栈中

    自动变量存放在栈里面,如果没初始化则值不确定。

    static int i; //bss ---->bss segment //0 未初始化不会对文件大小产生很大的影响,主要就是记录信息
    static int i = 1; //data ---->data segmint //RW
    const static int i = 1 //rodata ---->rodata segment //RO
    下面这段代码可以和汇编相媲美:

    #include SIZE 50

    int x[SIZE];
    int y[SIZE];
    void string()
    {
    register int *p1,*p2;
    for(p1 = x, p2 = y; p1 < &x[SIZE];)
    {
    *p1++ = *p2++;
    }
    }

    一个数组:array[N]------>2[array] == array[2] == *(2 + (array)) == *(array + 2);

    常见的动态内存错误:
    在使用动态内存分配的程序中,常常会出现许多错误,这些错误包括对NULL指针进行解引用操作,对分配的内存进行操作时越过了边界,
    释放并非动态分配的内存,试图释放一块动态分配的内存的一部分以及一块动态内存被释放后被继续使用。

    常见的搭配语句:
    free(p);
    p = NULL;

    结构体变量和自身引用需要注意的细节可以看C和指针196页

    *************************************************************************************************************************************************************
    *************************************************************************************************************************************************************
    *************************************************************************************************************************************************************
    *************************************************************************************************************************************************************

  • 相关阅读:
    2015.2.27 UltraEdit中显示XML结构
    2015.1.31 DataGridView自动滚动到某行
    2015.1.15 利用函数实现将一行记录拆分成多行记录 (多年想要的效果)
    2015.1.15 利用Oracle函数返回表结果 重大技术进步!
    2015.1.15 利用Oracle函数插入表结构 Bulk collect into 不用循环,简洁高效
    2015.1.8 Left join 左连接
    2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
    delphi 遍历窗口
    delphi 访问 protected 属性 哈哈
    clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈
  • 原文地址:https://www.cnblogs.com/cnlg/p/4263207.html
Copyright © 2011-2022 走看看