C语言乱弹

  

引子:

    好久没碰C了,感觉有点生疏了,不想扔下,于是乎写一篇日志回忆一下。欢迎大家转载,转载请注明出处。

1.

A>什么是指针

B>什么是数组

C>指针与数组有什么关系?

(最基本的几个概念,学C必须懂的   不懂得可以百度,google,也可以留言)

/************************************************************************************************************************************************************************/

内存管理

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类里面的类方法    有空多看看  库函数 基本都写的很经典

 

今天就到此结束   哈哈 洗洗睡觉吧

 

End   with   a new day !

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页