结构体,内存,指针例题.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页
*************************************************************************************************************************************************************
*************************************************************************************************************************************************************
*************************************************************************************************************************************************************
*************************************************************************************************************************************************************
结构体,内存,指针例题.DOC的更多相关文章
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...
- C#将结构体和指针互转的方法
. 功能及位置 将数据从托管对象封送到非托管内存块,属于.NET Framework 类库 命名空间:System.Runtime.InteropServices 程序集:mscorlib(在 msc ...
- C语言结构体和指针
指针也可以指向一个结构体,定义的形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: struct stu{ char *name; //姓名 int num; //学号 ...
- 37深入理解C指针之---结构体与指针
一.结构体与指针 1.结构体的高级初始化.结构体的销毁.结构体池的应用 2.特征: 1).为了避免含有指针成员的结构体指针的初始化复杂操作,将所有初始化动作使用函数封装: 2).封装函数主要实现内存的 ...
- 深入了解Windows句柄到底是什么(句柄是逻辑指针,或者是指向结构体的指针,图文并茂,非常清楚)good
总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解. ...
- 【学习笔记】【C语言】指向结构体的指针
1.指向结构体的指针的定义 struct Student *p; 2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...
- 关于C语言结构体,指针,声明的详细讲解。——Arvin
关于结构体的详细分析 只定义结构体 struct Student { int age; char* name; char sex;//结构体成员 };//(不要忘记分号) Student是结构体的名字 ...
- (八)C语言结构体和指针
指针也可以指向一个结构体变量.定义的一般形式为: struct 结构体名 *变量名; 前面已经定义了一个结构体 stu: struct stu { char *name; int num; char ...
- c语言里用结构体和指针函数实现面向对象思想
一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...
随机推荐
- JavaScript实现五子棋的界面设计
五子棋的界面设计包括绘制棋盘.绘制棋子及黑白棋轮流落子. 涉及的知识点主要有canvas绘制直线.设置画笔颜色:canvas画圆.填充渐变色 1.绘制棋盘 先设定棋盘的宽.高:然后利用for循环,根据 ...
- hdu 4009 Transfer water(最小型树图)
Transfer water Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)To ...
- A New Tetris Game
时间限制(普通/Java):1000MS/10000MS 运行内存限制:65536KByte 总提交: 40 测试通过: 12 描述 曾经,Lele和他姐姐最喜欢,玩得最 ...
- 阮一峰:RSA算法原理(一)
今天看到一篇好文章,关于加密算法,收藏了觉得不过瘾,还是自己贴一遍,也能加深一下印象. 原文链接:http://www.ruanyifeng.com/blog/2013/06/rsa_algorith ...
- Generic泛型
1.问题 未使用泛型时,元素的类型不安全:操作麻烦,可能需要强制转换import java.util.ArrayList;import java.util.List;import org.junit. ...
- php中curl和fsockopen发送远程数据的应用
最近要用到通过post上传文件,网上盛传的有curl的post提交和fsockopen,其中curl最简单,于是从最简单的说起. 这是简单的将一个变量post到另外一个页面 $url = ''; $d ...
- sqlserver 2008 存储过程调用存储过程或方法
函数:拆分字符串,并返回一个table CREATE FUNCTION [dbo].[f_splitSTR](@s varchar(max), --待分拆的字符串@split varchar(10) ...
- [示例]NSDictionary编程题-字典的排序应用(iOS6班)
代码: #import <Foundation/Foundation.h> static NSString * const kName = @"name"; stati ...
- 使用ASP.Net WebAPI构建REST服务(四)——参数绑定
默认绑定方式 WebAPI把参数分成了简单类型和复杂类型: 简单类型主要包括CLR的primitive types,(int.double.bool等),系统内置的几个strcut类型(TimeSpa ...
- 倍增 LCA
以NOIP2013提高组day1 最后一道题为例来学的倍增和lca.其实这套题早就做过了,倍增和lca也学过,只不过当时没有理解清楚,所以今天再次学了一遍,虽然没有时间编程序了,但是先把思路和做法在这 ...