
C/C++
Tyrion-Lannister
这个作者很懒,什么都没留下…
展开
-
函数指针数组的使用
......void func1(void){ printf("func1\n");}void func3(void){ printf("func3\n");}void func5(void){ printf("func5\n");}void (*pfunc[])(void) ={ NULL, func1, NULL,原创 2012-04-10 23:56:56 · 937 阅读 · 0 评论 -
为什么使用二级指针
设计一个函数:void find1(char array[], char search, char *pa) 要求: 这个函数参数中的数组array是以\0值为结束的字符串,要求在字符串array中查找与参数search给出的字符相同的字符。如果找到,通过第三个参数(pa)返回array字符串中首先碰到的字符的地址。如果没有找到,则为pa为NULL。依题意,实现代码如下原创 2012-03-30 21:48:47 · 5341 阅读 · 2 评论 -
指针与数组
#include int main(void){ int a[5]= {1, 2, 3, 4, 5}; int *ptr = (int *)(&a + 1); // 先取地址再加1 //printf("%p, %p\n", &a+1, ptr); //将地址输出 printf("%d, %d\n", *(a + 1), *(ptr - 1));原创 2012-03-30 17:29:16 · 595 阅读 · 0 评论 -
对数组名含义的理解
int array[3][4] = {...};区分array+1 和&array+1。 array+1是从array算起,按int[4]类型的大小,向前移动一步,此时array+1的值指在array[1]处。 而&array+1是从array算起,按int[3][4]类型的大小,向前移动一步(此步很大,整整扩过了二维数组), 此时&array+1的值指在二维数组array原创 2012-03-30 15:56:44 · 1363 阅读 · 0 评论 -
关于数组做为行参和实参
在函数声明中,如果有下面的写法: int func(int a[10]) { .... } 其中int a[10]的声明编译器自动处理为int *a 也就是说,在函数的形参列表里指定数组的成员个数是没有意义的,所以,你传入的实参究竟是比10多还是比10少对于调用函数而言都是合法的。 另外,你在函数的形参里指定数组的大小,编译器实际上并不给这个数组分配实际的空间,也就是说,形参里即转载 2012-12-02 21:16:56 · 1555 阅读 · 0 评论 -
数组作为函数形参时应注意的问题
在利用Google C++ Testing Framework --- gtest编写test case 时,引起了一个”奇怪的“问题: 1 int digitArray[] = {7, 8, 9};2 int size = sizeof digitArray / sizeof digitArray[0]; 将以上代码包含在测试函数TEST()中时,size求转载 2012-12-02 20:50:03 · 1347 阅读 · 0 评论 -
参数声明中的静态数组索引:一个不错且鲜为人知的C语言特性
C语言的创造者们一定都热衷于让关键字的数目尽可能的少.今天将向你展示另一个可使用C99中static关键字地方.也许你已经看到过在数组的参数声明中包括数组的长度:[cpp] view plaincopyprint?void foo(int myArray[10]); 这样的函数仍可接收整数指针int *,但是长度[1转载 2013-07-31 11:49:15 · 1236 阅读 · 0 评论 -
恼人的函数指针(二):指向类成员的指针
前面曾写过一篇恼人的函数指针(一),总结了普通函数指针的声明、定义以及调用,还有函数指针数组,函数指针用作返回值等。但是作为C++的研读,我发现我漏掉了一个最重要的内容,就是指向类成员的指针,这里将做相应补充(相关代码测试环境为vs 2010)。指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍:一、指向类的普通成转载 2013-08-29 15:58:08 · 759 阅读 · 0 评论 -
恼人的函数指针(一)
这篇是为了加深记忆所写。发现,很多知识若不经过反复的琢磨和动手实践,是很难记得住的。1) 函数指针的初始化。函数如下:1 int CompareString(const string& str1, const string& str2)2 {3 return str1.compare(str2); 4 }函数的初始化有两种方式:第转载 2013-08-29 15:59:22 · 1145 阅读 · 0 评论 -
c++ 仿函数(function object)和函数指针的差别
所谓仿函数,是定义了operator()的对象,下面这个例子:FunctionObject fo; fo();其中表达式fo()是调用仿函数fo的operator()。而非调用函数fo().你可以将仿函数看做一般函数,只不过用的是一种更复杂的撰写手段:并非将所有语句放在函数体中:void fo() { st转载 2013-10-20 19:51:50 · 4496 阅读 · 0 评论 -
指针和引用的比较
指针和引用的重要差异是指针可能(也可能不)指向某个实际对象,当我们使用指针时,一定要先确定其值并非为NULL,至于引用,则必会代表某个对象,所以不必检查。使用引用的另一个理由是如果使用引用,与直接传值方式的方法相同,使程序书写便利。强调一点,只有真正需要更改数值时才使用传址的方式,否则,都使用传值的方式。原创 2012-04-02 11:25:17 · 618 阅读 · 0 评论 -
函数中的数组
不要以为函数尚未调用时,数组就没规划空间。若用参数为数组指定元素个数,等函数被调用时,形参就有值了,此时创建数组m和n都已确定,于是就写成void user(int m, int n){ char A[m][n];}这种写法是错误的,数组(动态分配的除外)的大小是在编译的时候就“规划了”空间需求。尽管尚未真正分配空间。而形参变量在函数未调用时其值未定,编译器无法得到需求原创 2012-03-30 00:21:32 · 1235 阅读 · 0 评论 -
指针使用时需要注意的问题
1、未分配内存就使用它;2、内存分配未成功,却使用了它;3、内存分配虽然成功,但是尚未初始化就使用它;4、内存分配成功并且已经初始化,但操作越过了边界;5、忘记了释放内存或只释放一部分,造成内存泄漏;6、释放了内存却继续使用它;7、程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放;8、函数return语句写错了,返回了栈内存的地址;9、使用fre原创 2012-03-30 20:41:02 · 975 阅读 · 0 评论 -
数组指针和指针数组
数组指针即指向数组的指针变量, 以二维数组为例,它的一般说明形式为:类型说明符 (*指针变量名)[长度] 其中 “类型说明符”为所指数组的数据类型。 "*"表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。类似的,对于一个指向N维数组的指针可以这样定义: 类型说明符 (*指针变量名)[长度]原创 2012-03-30 17:00:10 · 924 阅读 · 0 评论 -
C++ void指针与NULL指针
指针有两个属性:指向变量/对象的地址和长度 但是指针只存储地址,长度则取决于指针的类型 编译器根据指针的类型从指针指向的地址向后寻址 指针类型不同则寻址范围也不同,例如: int*从指定地址向后寻找4字节作为变量的存储单元 double*从指定地址向后寻找8字节作为变量的存储单元void几乎只有“注释”和限制程序的作用 void真正发挥的作用在于:(转载 2012-08-18 20:13:12 · 817 阅读 · 0 评论 -
void指针的操作
1、可以与另一个任何类型的指针相比较;2、可以向函数的void类型的形参传入指针,但不可向非void类型的形参传入void指针;3、函数可以返回void类型的指针;4、可以向另一个该类型的指针赋值;5、可以得到任何类型的指针的值;6、不得对其所指向的对象进行任何操作;7、指向void*的二级指针类型还是void*。原创 2012-03-30 22:41:37 · 883 阅读 · 0 评论 -
变长(柔性)数组
结构体变长的妙用——0个元素的数组结构体变长的妙用——0个元素的数组有时我们需要产生一个结构体,实现了一种可变长度的结构。如何来实现呢?看这个结构体的定义:typedef struct st_type{int nCnt;int item[0];}type_a;(有些编译器会报错无法编译可以改成:转载 2012-10-25 23:36:47 · 1157 阅读 · 0 评论 -
第八章 柔性数组成员
在讲述柔性数组成员之前,首先要介绍一下不完整类型(incomplete type)。不完整类型是这样一种类型,它缺乏足够的信息例如长度去描述一个完整的对象。 6.2.5 Types incomplete types (types that describe objects but lack information needed to determine their sizes).转载 2012-10-25 23:25:15 · 536 阅读 · 0 评论 -
柔性数组
也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员。 柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分转载 2012-10-25 22:56:06 · 715 阅读 · 0 评论 -
对数组进行“整体赋值”
数组是不可以整体赋值的,但常常需要用到数组的赋值,以避免写循环。这能否做到? C语言中能赋值的只有变量,只要让数组变量化,变量赋值时岂不捎带将数组完成了赋值?! 能含有数组的类型只有结构体。于是可以:struct name{ int array[10];}a, b;于是,在a = b;时就完成了数组的赋值。注意:切不可“自赋值”,那会造成“内存重叠”,其原创 2012-03-30 15:47:08 · 12210 阅读 · 0 评论 -
关于数组元素个数
编程中常常需要用到数组的元素个数,判断是否越界。推荐一个比较方便、安全的方式:#define ARRAY_TOTAL(a) (sizeof(a) / sizeof(a[0]))const INT8U array[] = {0, 1, 2, 3, 4, 5};for (INT8U i = 0; i < ARRAY_TOTAL(array); ++i){ ... ...原创 2012-03-30 15:36:55 · 1133 阅读 · 0 评论 -
共用体的真正的妙用
union obj{ union obj *free_list_link; // 将来,用户向free_list_link链表申请“块”,成功则从链表摘下一个块。 // 它时而保存地址,时而保存用户的数据(目前是8bytes)。用户归还时就挂接在链表上。 char client_data[8];}原创 2012-03-24 20:24:41 · 1206 阅读 · 0 评论