A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Jobs 中级黑马   /  2014-9-24 09:56  /  1420 人查看  /  2 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

引子:
    为了进军IOS,虽然之前自己自学很久但是好久没碰C了,感觉有点生疏了,不想扔下,于是乎写一篇日志回忆一下。
A>什么是指针
B>什么是数组
C>指针与数组有什么关系?
(最基本的几个概念,学C必须懂的 ,不懂可以百度,希望对菜鸟们有用,也可以留言给我哦)

内存管理
1.代码段:存放操作指令,readonly
2.数据段:存放已初始化的全局变量,也就是存放静态分配的变量和全局变量
3.BBS段:存放未初始化的全局变量,内存中BBS段全置0
4.堆(heap):存放程序中动态分配的内存
5栈:存放局部变量,但不包括static变量
(画个图 让大家更明白  哈哈  图画的真不错,看了的人可以想一下那个波浪代表什么意思,想知道的可以留言)

1.进程空间地址如何管理
2.进程地址如何映射到物理内存
3.物理内存如何被管理
虚拟内存管理技术
用户空间
内核空间
(内存管理还是要好好学,自己感觉操作系统没怎么学好,还要加深啊 )

自定义strlen函数。(不用任何自定义变量)
int my_strlen(const char *str)
{
assert(str==NULL);
return ('/0'==str)? 0 , 1+my_strlen(++str);
}
//(C语言中有些很巧妙的方法,很好玩的,但是不推荐,因为有好多我自己也忘了,在保证大家能读懂的情况下还是可以用的)
/************************************************************************************************************************************************************************/
int a[5];
当a作为右值时代表数组元素的首地址,而非数组的首地址
a <==>&a[0]
!!! a不能作为左值
&a+1偏移量为 sizeof(a)
&a代表数组a的首地址

指针与指针数组
int *p1[10];//指针数组
int (*p2)[]10;//数组指针  相当于  int (*)[10]    p2;//匿名数组
[]优先级高于*

inta[5][5];
int (*p)[4];
p=a;
问:   &p[4][2] - &a[4][2]的值为多少?
解释:a代表a[0]的首地址
void fun(char a[3][4]);
<====>
void fun(char (*p)[4]);
<====>
void fun(char p[][4]);
//因为a代表a[0]的首地址

void fun(char *p[4]);
<====>
void fun(char **p);

char a[3][4] ;<====>  char (*p)[10];
char *a[5];<====>char**p;
(怎么说呢  数组与指针是很好玩的东东 其实数组和指针没啥关系  他们只是穿着很像的衣服而已 所以要分清他们还得从本质上去区分
很搞的   但是觉得弄懂了会很有成就感)


内存对齐
(在结构体中要注意的,搞不好就会出个幺蛾子,很简单 不解释  不懂请举手)
/************************************************************************************************************************************************************************/

const
(1)定义const常量
(2)修饰函数参数、返回值、甚至函数体

(具体例子就不讲了   方法就是在*号那里画个竖线  )


extern “C”
C不支持函数重载,C++支持重载。
C++函数名编译后变为像_foo_int_int    //函数参数会加到函数名中

(C与C++是两门不同的语言  不要认为C++包含C    而应该是C++兼容C  并不是包含 他们是两门不同的语言  至少编译规则就不同)
/************************************************************************************************************************************************************************/

自定义strcpy函数
原型:
char *strcpy(char *strDest, const char* strSrc)
{
assert((strDest!=NULL)&&(strSrc!=Nll));
char *address = strDest;
while((*strDest++ = *strSrc++)!='\0')
NULL;
return address;
}
这是C++string类里面的类方法    有空多看看  库函数 基本都写的很经典
我自己的技术也不是很强,只是看到哪学到哪,学东西也丢散落四的,写在这里留个纪念吧。

评分

参与人数 2技术分 +1 黑马币 +12 收起 理由
zrtalent + 8 赞一个!
★彬★卍囧神 + 1 + 4 很给力!

查看全部评分

2 个回复

倒序浏览
好东西啊,以前确实对内存管理的知识不是很理解。顶一个。
回复 使用道具 举报
感谢分享!很不错的基础知识
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马