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

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

时间: 2024-10-12 12:27:14

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

黑马程序员 C语言-枚举,结构体,指针

一.枚举 ※枚举变量的定义 前面只是定义了枚举类型,接下来就可以利用定义好的枚举类型定义变量. 跟结构体一样,有3种方式定义枚举变量 1.先定义枚举类型,再定义枚举变量 enum Season {spring, summer, autumn, winter}; enum Season s; 2.定义枚举类型的同时定义枚举变量 enum Season {spring, summer, autumn, winter} s; 3.省略枚举名称,直接定义枚举变量 enum {spring, summer

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

总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解.今天比较闲,我上网查了查,光是百度百科词条“句柄”中就有好几种说法,很多叙述还是错误的,天知道这些误人子弟的人是想干什么. 这里我列举词条中的关于句柄的叙述不当之处,至于如何不当先不管,继续往下看就会明白: 1.windows 之所以要设立句柄,根本上源于内存管理机制的问题—虚拟地址,简而言之数据的

C Language Study - 结构体成员指针初始化

结构体成员指针初始化 不可以正确运行的初始化方式(1): #include <stdio.h> #include <string.h> #include <malloc.h> //#include "a.h" //char a[100]; struct stu { char* name; int num; }*pst,st; void init_pst() { pst = (struct stu *)malloc(sizeof(struct stu)

结构体指针和结构体成员指针

在添加sqlite3的加解密功能函数时,由于网上资料针对的版本是旧版sqlite3源码,现在新版上做修改遇到了一个宏,该宏是旧版上的,它作用是由结构体成员指针pData找到它所属的结构体指针.下面转的文章详解了这种机制. 1.通过结构体成员指针寻找其所属结构体指针 转自http://blog.csdn.net/mycwq/article/details/9327743 宏CONTAINING_RECORD,可以直接根据结构体成员指针找到结构体指针. 我们看一下它的定义: 1 #define CO

结构体与指针

若我们用[0x9999]来标记内存地址,则 *[0x9999]表示该地址内存中存储的数值 变量int a;a *[0x9999] 1&a [0x9999] 指针int* a;a *[0x8888] [0x9999]*a *(*[0x8888]) *[0x9999] 1&a [0x8888] 结构体变量struct mystruct{ int a; [0x9991] int b; [0x9992] int c; [0x9993]}s; s *[0x9991] 1&s [0x9991]

结构体中指针赋值问题的分析及C代码示例

问题描述 某结构体的定义如下: typedef struct { int iAge; // 年龄 char szAddr1[100]; // 地址1 char *pszAddr2; // 地址2 char **pszAddr3; // 地址3 } T_PeopleInfo; 请问如何对结构体中的各个成员变量(尤其是指针变量)进行赋值? 问题分析及C代码示例 我们可以看到,在结构体T_PeopleInfo中,pszAddr2和pszAddr3均为指针,其中pszAddr2为一级指针,pszAddr

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

1. 功能及位置 将数据从托管对象封送到非托管内存块,属于.NET Framework 类库 命名空间:System.Runtime.InteropServices 程序集:mscorlib(在 mscorlib.dll 中) 2. 语法 C#: [ComVisibleAttribute(true)] public static void StructureToPtr (Object structure,IntPtr ptr,bool fDeleteOld); C++: [ComVisibleA

指针 指针与数组 指针与字符串 指针与函数 结构体与指针 宏

指针 指针与数组 指针与字符串 指针与函数?? 指针与数组 1.数组名:数组元素首地址 eg: int array[3]={1,3,6}; 这里array 恒等于&array[0] 2.int *p = a; int *p = 0; int a[]={0}; 3.int *p = a; 均指向数组的首地址 *p是? *(p+1)是?(*p)+1是? *(p+1)决定向下移动几个字节是类型 4.指针可以当数组名使用 p[1] = 3; 恒等于a[1] ;恒等于*(p+1);恒等于*(a+1) 5.

指向结构体的指针

运用指向结构体数组的指针输出学生信息 说明:指针指向结构体数组,就得到了该结构体数组的起始地址.通过该地址可以访问结构体数组中的所有成员变量.其中,指向结构体的指针的算术运算与 指向数组的指针的用法相似. #include<stdio.h> #define N 10 //结构体类型及变量的定义,初始化 struct student { char *number; char *name; char sex; int age; float score; }stu[3]={{"06001&

代码案例(结构体,函数指针,指针函数,冒泡排序) 修改

#import <Foundation/Foundation.h> typedef struct {     char name[20];     int age;     float score; }Stu; //建立字符串和函数之间的一一对应关系. typedef BOOL (*PStu) (Stu stu1,Stu stu2) ; typedef struct nameFunctionPair{     char name[20]; //存储函数对应的字符串     PStu funct