C深度解剖问题代码分析笔记2
<!--
@page { margin: 0.79in }
P { margin-bottom: 0.08in }
-->
是C深度解剖 P47的一系列关于define和typedef的用法:
/****以下是
#define
a int[10]
的各种用法,都报错
***
a[10]
a[10];
//**************
a[10]
a;
//**************
int
a[10];
//**************
int
a;
//**************
a
b[10];
//**************
a
b;
//**************
a*
b[10];
//**************
a*
b;
*********************************************/
/******以下是
typedef
int a[10]
;
的用法
*****************
//typedef
int a[10]定义了一种包含
10个
int的数组的类型
a[10]
a[10];//报错
,没有标识符
//******************************************
a[10]
a; //报错
,没有标识符
//******************************************
int
a[10]; //如常
,a[10]只是个普通的数组
//******************************************
int a;
//如常
,a只是个普通的变量
//******************************************
a
b[10];
//sizeof(a)为
40
//b[10] 是个二维数组,包含了
10*10个
int
//b[1][1]=2;//可以如常使用
//******************************************
a
b;
//b是个线性数组
//******************************************
a*
b;
//b
是个
a型指针
,可以如此操作:
b=malloc(sizeof(a));
int i;
for(i=0;i<10;i++)
{
(*b)[i]=i;
}
for(i=0;i<10;i++)
{
printf("%d
",*(*b+i)); //与
(*b)[i]一样
}
可能有人会认为这里的
a*
b; 是声明一个指针数组,类似于
int
*p[10]。
然而两者有本质的不同,简单来讲,前者是一个
40字节的框子,
b+1就会向前移
40字节框住下
40个字节;后者是个
4字节的框子,
p+1只会前移
4字节框住下
4个字节。
//******************************************
a*
b[10];
//b[10]是
10个
a型数据构成的数组,也就是说有
100个
int
int
i,j;
for(i=0;i<10;i++)
{
b[i]=(a*)malloc(sizeof(a));
for(j=1;j<11;j++)
{
(*(b[i]))[j]=i*10+j;
}
printf("\n");
}
for(i=0;
相关文档:
一般变量定义在*.c文件中,而*.h文件中声明变量或函数名和符号名.
避面重复编译的解决方法:
比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件都要调用同一个头文件去编译,重复编译会产生大量的声明冲突。解决这个问题的方法使用#ifndef, #endif, #endif。
&nbs ......
网上看到的这篇关于Linux下C语言嵌入汇编的文章写的非常全,转载过来。
Using Assembly Language in Linux.
Intel和AT&T汇编语法差异:
1。前缀:
Intel汇编寄存器和立即数无需前缀。后者寄存器前缀为%,立即数前缀为$。
eg:
Intex Syntax
mov eax,1
mov ebx,0f ......
定义按值传递和按引用传递这两个术语是重要的。
按值传递意味着当将一个参数传递给一个函数时,函数接收的是参数的一个副本。因此,如 果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是参数的内存地址,而不是参数的副本。因 此,如果函数修改了该参数,调 ......
#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int*)(&a+1);
int *ptr2=(int*)((int)a+1);
printf("%p,%x,%p\n",(int)a,*(ptr2+1),ptr1);//(int*)(&a));
printf("%d\n",(int*)(&a-16));
printf("%d,%x\n",ptr1[-1] ......