1、 * const 函数指针typedef
指针数组 数组指针:
int *p[2]; 一个数组 每个元素是指针 指针数组
int i=1;
int j=2;
//p先跟[]结合,然后再跟*结合
int *pa[2];//指针数组,存放指针的数组
pa[0]=&i;
pa[1]=&j;
printf("%d\n",sizeof(pa)); 8
int (*p)[2]; 一个指针 指向数组的指针 数组指针
int a[3][2];
int (*p)[2];
p=a;
printf("%d %d\n",sizeof a,sizeof pp); 24 4
const判断:
(先去掉const看释义;const谁,谁不能更改)
const int *p; <=> int const *p; 指向const int型的指针 *p不能更改 p可以更改指向其他
int * const r= &n; r的值不能更改已经指向n, 但*r=n的值可以更改
函数指针问题:
怎么定义一个变量,加typedef即可定义一个类型 (变量类型对应替换) http://bbs.csdn.net/topics/390098150
int i;//i是变量
typedef int i;//i是int的类型别名
int (*fpn)(int);
typedef int (*fpn)(int);
int f(int);
f<->(*fpn) 直接替换f即可定义一个函数指针
char* a[n];
char* (foo())[n]; error
char* (*foo())[n]; OK
char* (*(*ptr2foo)())[n];
char* (*(*ptr2bar)(int))[n];
char* (*(*ptr2bar)(int *))[n];;
typedef int * P2I;
typedef char* (*(*P2FB)(P2I))[n];
2、结构体和类定义放在头文件中,变量定义放在c或cpp中,需要在其他文件中用的,还要extern到h中
3、内存分配和存储空间
http://blog.csdn.net/gukesdo/article/details/6548256
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b;// 栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //"123456/0"在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
text
代码段,这个存放代码的,用汇编角度来看就是指令。
.rdata
只读数据段,存放常量,字符常量,const常量,据说还存放调试信息。
.data
数据段,存放已经初始化好的全局变量和静态变量。除了上面的static变量,还有存储在堆栈段的自动变量,其他所有变量都在.data里,典型的有各类全局变量
.bss
bss段, 存放未初始化的全局变量和静态变量
.rdata,.data, .text段的(值)都是在编译的时候就确定了,并且将其编译进了可执行文件,经过反汇编都能找得到
.bss 未初始化 需要运行是确定其值;
.rdata,.text段不可更改 .data .bss 可更改