1,%p表示输出指针变量的值,也就是内存地址
2,指针的话本身大小是定死的,只占用4个字节,无论它指向的变量占几个字节
3,如果在方法间传递参数,那必须要传递地址而非值
4,跨函数使用内存,动态分配的内存,必须通过free来进行释放,如果没有释放,那么即使该内存在方法里,
而该方法
已经执行完毕,方法内的非动态内存变量被回收内存了,那这个动态内存变量也不会被回收
5,java中的A aa=new A();其实的实现原理就是A *pa=(*A)malloc(sizeof(A));,也就是跨函数使用内存
6,%运算符:取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同
如:13%3=1 13%-3=1 -13%3=-1
7,逗号表达式的使用
int i,j=2;//逗号表达式,从左到右执行,最终表达式的值是最后一项的值
i=(j++,j+2,++j,j-1);
printf("%d\n",i);//结果为3
8,如果函数返回值与函数的返回类型不一致,那么以函数前面的返回值类型为准
9,什么是地址
10,一维数组名是个指针常量,它存放的是一维数组第一个元素的地址
11,获得数组的长度:int a[5]={1,2,3,4,5};int length=sizeof(a)/sizeof(int);
也可以使用宏定义:#define GetLen(arr) sizeof(arr)/sizeof(int) int length=GetLen(a);
12,指针变量不能相加,相乘,相除,如果两个指针变量指向的是同一块连续空间中的不同存储单元,则这两个指针变量才可以相减
13,
14,pst->age 等价于(*pst).age 也等价于st.age
15,狭义的算法:对存储数据的操作,对不同的数据结构,要完成某一个功能所执行的操作是不一样的
比如:要输出数组中所有的元素的操作和要输出链表中所有元素的操作肯定是不一样的
这说明:
算法是依附于数据结构的,不同的存储结构所执行的算法肯定是不一样的
广义的算法:广义的算法也叫泛型,无论数据是如何存储的,对数据的操作都是一样的
如:for(i=0; i<len; i++){printf("%d\n",*p);p++},
在数组中肯定是可以这样子操作的,因为可以p指针可以指向到数组的首元素地址
在链表中可以像c++那样重载++的操作符,把++转换到一个++()的函数中去,然后在该函数中实现p=p->next;
16,空指针NULL
NULL本质也是零,而这个零不代表数字零,而表示的是内存单元的编号0。比如4G内存,那么内存编号是0-2的32次方-1
计算机规定了,以零为单元的存储单元的内容不可读,不可写
17,
18,
PNode p = (PNode)malloc( sizeof(PNode) );
free( p );删除p所指向节点的内存,而不是删除p本身所占用的内存
19,比如一个数组有五个元素,那么指针可以指向到第六个地址,但是不能使用这第六个地址
20,在c语言中,c语言并没有规定int和long型具体占用几个字节,只是规定了int不能比long的字节大,相等没事,所以不同的软件便有不同的实现方式