结构体,内存,指针例题.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页

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

原文地址:https://www.cnblogs.com/cnlg/p/4263207.html