- 博客(14)
- 收藏
- 关注
原创 c语言中的字节对齐
一、什么是字节对齐?计算机中的数据在存储时并不是按顺序存储,因为在访问特定的数据类型时通常从特定的内存地址开始,所以数据在存储时特定的类型存储时从特定的地址开始,比如我们所说的int类型的对齐数是4,意思是存储这个int类型的变量的地址%4==0,这就是对齐数为4的意思。二、为什么要字节对齐?字节对齐是的思想就是以空间换取时间。所以在存储数据时采取字节对齐的方式,可以让cpu在访存读取
2015-12-14 18:52:12 502
原创 通过冒泡排序的快速排序练习使用回调函数
首先什么是回调函数?回调函数是什么?函数指针作为调用函数的参数,通过这个指针可以回调这个指针指向的函数,这样的技巧就是利用回调函数,回调函数就是这个指针指向的函数。一个简单的例子:#include#includevoid fun(){ printf("hello ");}void pfun(void (*p)()) //函数的参数是一个函数指针(是一个地址){
2015-12-08 17:56:50 393
原创 字符串操作函数的编写
size_t my_strlen(char const *string)//字符串长度{ assert(string != NULL); size_t count = 0; while (*string++ != '\0') count++; return count;}char *my_strcpy(char *dst, char const *src){
2015-12-08 15:49:36 321
原创 c语言最强大之处--指针
指针是与地址分不开的,提到指针就应该想到地址,因为在c语言中指针变量所存放的值就是一个地址,通过这个值它可以指向这个地址的内存位置,也就可以通过这个指针变量来访问这个内存位置的内容。定义一个指针变量的方法和其他变量是一样的:int *a;char *b;... 这里指针变量a是指向整形的指针,其中a的值是所指向的整形空间的四个字节的第一个字节的地址;b是指向字符型的指针,b的值是这个字符的地址。对
2015-12-08 15:49:32 752
原创 c语言中统计二进制位中1的个数的算法优化
统计整数二进制位中1的个数的办法:int one(int m){ int count = 0; while (m != 0) { if (m % 2 == 1) //进行模2除2一位一位的统计 { count++; } m /= 2; }}或者下面这种位于运算的int two(int m){ int count = 0; whi
2015-12-08 15:49:28 388
原创 c语言中对可变参数列表的简单理解
函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现。可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中。头文件中声明了一个va_list类型和va_start、va_arg、va_end三个宏。我们使用可变参数列表的时候需要声明一个va_list类型的变量配合这三个宏使用。va_start(va_list变
2015-12-08 15:49:24 551
原创 c语言中递归函数真的好吗?
递归函数就是直接或者间接的调用自己本身的函数。接触递归的时候我们经常会看到这个程序#include#includelong factorial(int n){ if (n <= 0) return 1; else return n*factorial(n - 1);}int main(){ int n = 5; printf("%ld\n", factorial(n
2015-12-08 15:49:21 643
原创 break和continue语句
在c语言中使用循环是非常常见的,有时候我们会想要提前结束循环,或者循环执行满足(或者不满足)某个条件时接下来的语句我们并不想让它执行,这个时候我们会经常使用到break和continue两个语句。这两个语句在循环中有着很重要的作用。break语句:假设我们要设置一个死循环模拟两个人对弈的过程while(1){ ... //假设是两个人在对弈 ...
2015-12-08 15:49:18 390
原创 一个简单的三子棋游戏(c语言实现)
题目是:在一个3*3大小的矩阵中下棋一方有连续三个子便获胜代码如下:#include#include#include char arr[3][3] = { 0 }; //直接定义外部变量所有的函数可以直接使用 因为考虑到棋盘大小是固定的int size = 9; //棋盘大小固定 每下一个子都会使可
2015-12-08 15:49:14 501
原创 gets()函数和puts()函数的渊源关系
对于字符串的处理函数gets()和puts()的结束标志有必要讨论一下gets()函数是从标准输入设备读取字符串直到换行符结束,但是换行符会被丢弃,并且在末尾加上一个字符串结束标志 '\0' ,而与其相对应的puts()函数是将从标准输入设备输入的字符串打印到屏幕上,但是在打印的时候它会做一件事情就是将刚刚输入时所得到 '\0'自动转换成换行符,就是在输出字符串后自动换行。一个简单的应用:#i
2015-12-08 15:49:11 425
原创 c语言怎么会有这么多的作用域?
首先作用域是什么? 顾名思义作用域就是一个东西能起作用的范围,当然这个解释未免有些太过于笼统,在c语言中作用域就是指声明一个变量,而这个变量能被访问的这个区域就是它的作用域。这个变量的被访问的区域由着个变量的标识符的作用域所决定。标识符的作用域就是程序中该标识符可以被使用的区域。c语言的编译器可以大体的分出四个作用域 分别是:文件作用域、函数作用域、代码块作用域、原型作用域。代码块作用
2015-12-08 15:49:07 394
原创 大小端存储的理解
在计算机内存中的数据存储的都是机器二进制序列,在学习c/c++语言的时候会定义到一些变量,比如int(整形)、char(字符型).....但是在计算机中是怎样存储的呢?计算机的内存地址是有高低之分的,那么一个整形数在内存中占有四个字节它又是怎样存储的呢?是低位放在低地址,还是低位放在高地址?在这里我们可以通过一个小小的c程序来进行验证一下:#include#includeint main(
2015-12-08 15:49:03 411
原创 通过转移表练习函数指针的使用
通过了解指针我们直到了一些常规类型的指针int a=1; //整形变量char b='1'; //字符型变量int *p1=&a; //指向整形指针char *p2=&b; //指向字符型的指针....p1是一个指向整形的指针,p2是一个指向字符型的指针,同样我们也接触了一些高级的指针int **pp=&p1; //二级指针 pp是指向指针的指针int (*p3)[10]
2015-12-06 23:29:51 399
原创 自己实现的字符串操作函数
/*自己编写实现字符串相关的函数包括四个基础的字符串操作函数strlen()、strcpy()、strcmp()、strcat()以及扩展的strstr()还有两个操作内存的memcpy()、memmove()*/#define _CRT_SECURE_NO_WARNINGS#include#include#include/*求字符串长度的函数*/int my_strlen1(con
2015-12-02 10:55:51 392
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人