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("\n");

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页

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

结构体,内存,指针例题.DOC的更多相关文章

  1. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...

  2. C#将结构体和指针互转的方法

    . 功能及位置 将数据从托管对象封送到非托管内存块,属于.NET Framework 类库 命名空间:System.Runtime.InteropServices 程序集:mscorlib(在 msc ...

  3. C语言结构体和指针

    指针也可以指向一个结构体,定义的形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: struct stu{ char *name; //姓名 int num; //学号 ...

  4. 37深入理解C指针之---结构体与指针

    一.结构体与指针 1.结构体的高级初始化.结构体的销毁.结构体池的应用 2.特征: 1).为了避免含有指针成员的结构体指针的初始化复杂操作,将所有初始化动作使用函数封装: 2).封装函数主要实现内存的 ...

  5. 深入了解Windows句柄到底是什么(句柄是逻辑指针,或者是指向结构体的指针,图文并茂,非常清楚)good

    总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解. ...

  6. 【学习笔记】【C语言】指向结构体的指针

    1.指向结构体的指针的定义 struct Student *p;  2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...

  7. 关于C语言结构体,指针,声明的详细讲解。——Arvin

    关于结构体的详细分析 只定义结构体 struct Student { int age; char* name; char sex;//结构体成员 };//(不要忘记分号) Student是结构体的名字 ...

  8. (八)C语言结构体和指针

    指针也可以指向一个结构体变量.定义的一般形式为: struct 结构体名 *变量名; 前面已经定义了一个结构体 stu: struct stu { char *name; int num; char ...

  9. c语言里用结构体和指针函数实现面向对象思想

    一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...

随机推荐

  1. ubuntu下python3安装类库

    ubuntu是默认安装了python2的,所以直接使用 pip install XXX 是默认安装到python2的,安装到python3 的指令是 pip3 install XXXX 或者 pyth ...

  2. Java构造函数的继承问题

    ◎构造函数的继承 1.子类只继承父类的默认(缺省)构造函数,即无形参构造函数.如果父类没有默认构造函数,那子类不能从父类继承到任何构造函数. 3.在创建对象时,先调用父类默认构造函数对对象进行初始化, ...

  3. 呆呆的io流输入输出的一些基础

    关于io流的File类,下面来码一些基础属性: 文件的属性: /* public String getName() 获取文件的名字 public boolean canRead() 判断文件是否可以读 ...

  4. HIbernate实现增、删、改、查。

    //大配置 <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC " ...

  5. css3导航-磊哥

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  6. EF 7 Code First

    加载方式三种 1. Eager Loading 2. Lazy Loading 3.Explicit Loading 使用EF在与关系型数据库的交互中不可避免地需要加载数据,如何加载数据变得至关重要. ...

  7. [转]Linux下用gcc/g++生成静态库和动态库(Z)

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

  8. .net调用存储过程碰到的一个问题

    问题描述 报错信息如下: Execution of user code in the .NET Framework is disabled. Enable "clr enabled" ...

  9. java面向对象编程——第二章 java基础语法

    第二章 java基础语法 1. java关键字 abstract boolean break byte case catch char class const continue default do ...

  10. 10 notorious computer virus

    The history of computer virus is the same as computer history. With more and more powerful computers ...