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. 通过chrome 获取网站的cookie信息

    通过chrome 打开网页 审核元素 登录网站后 network列表中查看 home?开头列表项的 cookie信息

  2. WindowsService(Windows服务)开发步骤附Demo 【转】

    转http://www.cnblogs.com/moretry/p/4149489.html 1.打开VS,新建项目,选择Windows服务,然后设置目录及项目名称后点击确定. 2.展开Service ...

  3. javaSE之线程联合

    首先定义 : 一个线程A在占有CPU资源期间 ,可以让其他线程调用join()和本线程联合. 嗯哈,像书本这个列子: 如: B.join(); 我们称A在运行期间联合了B, 如果线程A在占有CPU资源 ...

  4. centos彻底删除文件夹、文件命令

    [1]新建文件夹 格式:mkdir 文件名 view source1 mkdir /home/test     新建一个名为test的文件夹在home下 [2]新建文本 vi /home/test.s ...

  5. 20145236 《Java程序设计》实验五实验报告

    20145236 实验五 Java网络编程 实验内容 1.运行TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TC ...

  6. [工作需求]linux常用命令以及vim常用命令

    一.             Linux 常用命令 mkdir dirname新建文件夹 cd ~ 进入自己的家目录 cd dirname 进入名字为dirname的目录: l 显示当前文件夹下的文件 ...

  7. gawk

    gawk '$2>365&&$3>1' part-00000 | wc -l

  8. Hive的Transform功能

    Hive的TRANSFORM关键字提供了在SQL中调用自写脚本的功能,适合实现Hive中没有的功能又不想写UDF的情况.例如,按日期统计每天出现的uid数,通常用如下的SQL SELECT date, ...

  9. 设置ASP.NET MVC站点默认页为html页

    问题由来 部署了一个Asp.Net MVC的站点,其功能只是作为移动端的服务器,服务器空间里面除了CMS以外就没有其他的页面了.这对于我们来说确实是有点浪费了. 可以放点静态的啥小东西放在上面玩一玩. ...

  10. PowerMock使用遇到的问题——2

    如果在测一个类的某一个方法时,这个方法还调用了此类的其他方法,那么如何指定其他方法的返回值呢? Partial mock local private method or public method i ...