函数形参从右到左入栈

int add(int count, ...) { // 指针大小与程序位数有关(32位指针是4个字节,64位指针是8个字节) int intSize = sizeof(int*) / sizeof(int); int sum = 0; // cout << &count << endl; int *p = &count + intSize; // cout << p << endl; for (int i = 0; i < count; ++i) { sum += *p; cout << *p << endl; p += intSize; } return sum; } int main() { cout << add(3, 1, 2, 3) << endl; return 0; } 输出:...

December 22, 2021 · 1 min · Rick Cui

指针 + 1

1. 32 位和 64 位程序指针是多少位 32位指针大小为4个字节,64位指针大小位8个字节 2. 指针加 1,是对该指针增加 1 个储存单位 “存储单位”,指的是指针指向的数据类型所占的内存的字节数。不同类型的指针加1后,增加的大小不同。 int main() { int a[] = {1, 2, 3, 4, 5}; // &a是数组指针,其类型为 int (*)[5],a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a[5]; // &a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int) // 但是prt与(&a+1)类型是不一样的(这点很重要,ptr指向的是整形),所以prt-1只会减去sizeof(int) int *ptr = (int*)(&a + 1); cout << *(a + 1) << endl; cout << *(ptr - 1) << endl; return 0; } 输出: 2 5 注: a,&a的地址是一样的,但意思不一样: a是数组首地址,也就是a[0]的地址,a+1是数组下一元素的地址,即a[1] &a是对象(整个数组作为一个对象)首地址,而&a+1是下一个对象的地址,即a[5].

December 22, 2021 · 1 min · Rick Cui

模板类

结论 不建议将模板类的声明和定义分开,一般把这个文件叫做 .hpp,以便与 .cpp 文件进行区分,表示这个文件中使用了模板 模板类进行了两次编译,在第二次编译(模板类使用的时候)时才会生成真正的调用函数 声明和定义分开方式一:可将定义放在同名的 .inl 或 .tpp 文件中,同时在头文件的末尾使用 #include 包含进来,不可放到 .cpp 文件,否则会造成嵌套包含 声明和定义分开方式二:在头文件中声明实例化,并在一个源文件中定义它,这样它只会被实例化一次,而不是每个翻译单元,这可能会加快编译速度,但是只能使用已经显式声明的模板类实例 不建议在模板类中使用友元函数 声明和定义在同一文件 // Test.h // 写法二:前置声明 template<typename T> class Test; template<typename T> void printTest(Test<T>& t); template<class T> class Test { public: Test(T t){ m_t = t;}; // explicit Test(T t){ m_t = t;}; // 1. 直接在类内定义 // T getValue(){ // return m_t; // }; // 2. 类外定义 T getValue(); // 3....

December 22, 2021 · 2 min · Rick Cui

模板函数

template <typename T> inline const T& Max (const T& a, const T& b) { return a < b ? b:a; }; int main() { int i = 39; int j = 20; cout << "Max(i, j): " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0; } 输出:...

December 22, 2021 · 1 min · Rick Cui

函数指针

#include <iostream>#include <cstdlib>using namespace std; // 声明函数指针变量 int (*fn)(int) = NULL; // 定义函数指针类型 typedef int (*Fn)(int); int cal(int v){ return v; }; int max(int a, int b){ return a > b ? a : b; } // 函数指针做为参数 void proc(int v, Fn f){ cout << f(v) << endl; }; // 函数指针作为函数返回值 int (* retFP(string fName))(int, int){ // lambda 表达式作为函数指针返回 int (*fp)(int,int) = [](int x, int y){ return x > y ?...

December 16, 2021 · 2 min · Rick Cui