C++——malloc、calloc、realloc、指针杂记

void printArr(int *A, int size){ printf("Elements of array: "); for(int i = 0; i < size; ++i){ printf("%d\t", A[i]); } printf("\n"); } int main() { int C[3][2][2] = {{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}}; // 虽然地址相同,但代表的意义却不相同 printf("%p\t%p\t%p\t%p\t%p\t%p \n", C, *C, C[0], C[0][0], &C[0][0], &C[0][0][0]); printf("%p\t%p\t%p\n", *C+1, C[0]+1, C[0][1]); printf("%p\t%p\n", C, C[0][0] + 1); printf("%p\t%p\n", C, &C[0][0] + 1); // 分配空间,但不会对元素进行初始化 int *A = (int*)malloc(3 * sizeof(int)); for(int i = 0; i < 3; ++i){ A[i] = i+1; } printArr(A, 3); // 分配空间,并将元素初始化为0 int *B = (int*)calloc(3, sizeof(int)); printArr(B, 3); // 重新分配一块空间(新空间可大可小) // 并把原来的数据拷贝过来 // 如果新空间首地址与原来空间地址不同,会将原来的内存空间释放 // ,注意:此时不能再继续访问原来的地址,虽然原来的指针并未置空 int *D = (int*)realloc(A, 10 * sizeof(int)); printf("%p\t%p\n", A, D); printArr(A, 3); // 此时不能访问 A 了,这是危险的行为 printArr(D, 10); // 等同于重新分配了空间 D = (int*)realloc(NULL, 3 * sizeof(int)); // int *D = (int*)malloc(3 * sizeof(int)); printf("%p\t%p\n", A, D); printArr(D, 3); // 等同于释放了内存空间并将指针置为空值 D = (int*)realloc(D, 0); // free(D);D = nullptr; printf("%p\n", D); return 0; } 输出:...

October 2, 2022 · 1 min · Rick Cui

C++——计算最大和子矩阵问题

描述 计算矩阵中,最大和的子矩阵,并输出最大的和 测试用例 用例一: $$\begin{equation} \begin{bmatrix*}[c] -3 & -5 & -1 & 5 \newline 2 & -4 & -2 & 4 \newline -1 & 3 & -1 & 3 \end{bmatrix*} \end{equation}$$ 用例二: $$\begin{equation} \begin{bmatrix*}[c] -3 & -5 & -1 & 5 \newline 9 & -4 & -2 & 4 \newline -1 & 3 & -1 & 3 \end{bmatrix*} \end{equation}$$ 用例三: $$\begin{equation} \begin{bmatrix*}[c] -3 & -5 & -1 & 5 \newline 7 & -4 & -2 & 4 \newline -1 & 3 & -1 & 3 \end{bmatrix*} \end{equation}$$...

September 27, 2022 · 8 min · Rick Cui

C++——旋转骰子问题

方法一:使用字符串 注意 : 字符与字符相加返回的是一个整数 字符串与字符相加的问题: 可以使用 + 号运算符,但其中一个操作数需要是 string 类型 如果需要连续相加多个字符,前两个操作数必须有一个是 string 类型的 可以使用 string.append 方法 控制台输入字符串的问题,如果直接使用 cin >> str,遇到空格和回车都会终止读取 例如:在字符串 s 后面添加 ‘a’、‘b’、‘c’ 三个字符 参考 C++ 运算符优先级和结合性 string s; s = s + 'a' + 'b' + 'c'; // 正确 s += 'a' + 'b' + 'c'; // 错误 s = 'a' + 'b' + 'c' + s; // 错误 int main(){ string LR = "1625", FB = "3645", AC = "1324"; string mov; getline(cin, mov); for (char c : mov) { string tmp = ""; switch (c) { case 'L': case 'R': { if (c == 'L') { // LR = tmp + LR[3] + LR[0] + LR[1] + LR[2]; LR = LR[3] + string(LR, 0, 3); } else { // LR = tmp + LR[1] + LR[2] + LR[3] + LR[0]; LR = string(LR, 1, 3) + LR[0]; } // FB = tmp + FB[0] + LR[1] + FB[2] + LR[3]; FB[1] = LR[1]; FB[3] = LR[3]; // AC = tmp + LR[0] + AC[1] + LR[2] + AC[3]; AC[0] = LR[0]; AC[2] = LR[2]; break; } case 'F': case 'B': { if (c == 'F') { // FB = tmp + FB[3] + FB[0] + FB[1] + FB[2]; FB = FB[3] + string(FB, 0, 3); } else { // FB = tmp + FB[1] + FB[2] + FB[3] + FB[0]; FB = string(FB, 1, 3) + FB[0]; } // LR = tmp + LR[0] + FB[1] + LR[2] + FB[3]; LR[1] = FB[1]; LR[3] = FB[3]; // AC = tmp + AC[0] + FB[0] + AC[2] + FB[2]; AC[1] = FB[0]; AC[3] = FB[2]; break; } case 'A': case 'C': { if (c == 'A') { AC = tmp + AC[3] + AC[0] + AC[1] + AC[2]; } else { AC = tmp + AC[1] + AC[2] + AC[3] + AC[0]; } LR = tmp + AC[0] + LR[1] + AC[2] + LR[3]; FB = tmp + AC[1] + FB[1] + AC[3] + FB[3]; break; } default: break; } } cout << LR[0] << LR[2] << FB[0] << FB[2] << LR[3] << LR[1]; return 0; } 方法二:使用 deque 容器 int main() { //string LR = "1625", FB = "3645", AC = "1324"; deque<char> LR, FB, AC; LR....

September 23, 2022 · 4 min · Rick Cui

C++——List、strcpy_s、strtok_s 使用

目标 对输入的字符串中的单词,把给定的索引区间中的单词逆序 方法一 通过 strtok(strtok_s、strtok_r) 分割字符串 使用 list 容器存储各个单词 可以通过前插的方式反转指定区间的单词 也可以通过前后交换的方式反转指定区间的单词 顺序输出 list 中的单词 int main(){ string str = "I am a developer"; char *cArr = new char[str.size()+1]{0}; strcpy_s(cArr, str.size()+1, str.c_str()); // 注意:第二个参数,要拷贝的字符串的长度包括结尾的 '\0' char *w = nullptr, *rest = nullptr; list<string> wordList; w = strtok_s(cArr, " ", &rest); while (w) { wordList.push_back(w); w = strtok_s(nullptr, " ", &rest); } int startIndex = 0, endIndex = 0; cin >> startIndex >> endIndex; int len = wordList....

September 22, 2022 · 2 min · Rick Cui

C++——类模板双栈模拟队列

September 20, 2022 · 0 min · Rick Cui