cpoint
#
指针定义与初始化
#
#include <stdio.h>
int main() {
int num = 10;
int *ptr = # // 定义指向int的指针
printf("变量值: %d\n", num);
printf("指针指向的值: %d\n", *ptr);
printf("指针地址: %p\n", ptr);
printf("变量地址: %p\n", &num);
return 0;
}
基本运算
#
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf("初始指针位置: %p\n", ptr);
printf("值: %d\n", *ptr);
ptr++; // 指针前进
printf("前进后位置: %p\n", ptr);
printf("值: %d\n", *ptr);
ptr--; // 指针后退
printf("后退后位置: %p\n", ptr);
return 0;
}
数组指针操作
#
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr;
// 通过指针访问数组元素
for(int i = 0; i < 5; i++) {
printf("arr[%d] = %d, *(ptr+%d) = %d\n",
i, arr[i], i, *(ptr + i));
}
return 0;
}
指针作为函数参数
#
#include <stdio.h>
// 交换两个变量的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
printf("交换前: x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("交换后: x = %d, y = %d\n", x, y);
return 0;
}
返回指针的函数
#
#include <stdio.h>
#include <stdlib.h>
int* createArray(int size) {
int *arr = (int*)malloc(size * sizeof(int));
for(int i = 0; i < size; i++) {
arr[i] = i * 10;
}
return arr;
}
int main() {
int *myArray = createArray(5);
for(int i = 0; i < 5; i++) {
printf("myArray[%d] = %d\n", i, myArray[i]);
}
free(myArray); // 释放内存
return 0;
}
二级指针示例
#
#include <stdio.h>
int main() {
int num = 100;
int *ptr = #
int **pptr = &ptr; // 指向指针的指针
printf("num的值: %d\n", num);
printf("*ptr的值: %d\n", *ptr);
printf("**pptr的值: %d\n", **pptr);
printf("num的地址: %p\n", &num);
printf("ptr的值: %p\n", ptr);
printf("*pptr的值: %p\n", *pptr);
return 0;
}
字符串指针操作
#
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello World";
char *ptr = str;
printf("字符串: %s\n", str);
printf("通过指针: %s\n", ptr);
// 遍历字符串
while(*ptr != '\0') {
printf("%c ", *ptr);
ptr++;
}
printf("\n");
return 0;
}
函数指针基础
#
#include <stdio.h>
// 简单的数学函数
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int multiply(int a, int b) { return a * b; }
int main() {
// 声明函数指针
int (*operation)(int, int);
int x = 10, y = 5;
// 使用函数指针调用不同的函数
operation = add;
printf("%d + %d = %d\n", x, y, operation(x, y));
operation = subtract;
printf("%d - %d = %d\n", x, y, operation(x, y));
operation = multiply;
printf("%d * %d = %d\n", x, y, operation(x, y));
return 0;
}
malloc和free使用
#
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("请输入数组大小: ");
scanf("%d", &n);
// 动态分配内存
int *arr = (int*)malloc(n * sizeof(int));
if(arr == NULL) {
printf("内存分配失败!\n");
return 1;
}
// 初始化数组
for(int i = 0; i < n; i++) {
arr[i] = i * i;
}
// 打印数组
printf("动态数组内容: ");
for(int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 释放内存
free(arr);
return 0;
}
指针数组示例
#
#include <stdio.h>
int main() {
int a = 1, b = 2, c = 3;
int *ptr_arr[3]; // 指针数组
ptr_arr[0] = &a;
ptr_arr[1] = &b;
ptr_arr[2] = &c;
for(int i = 0; i < 3; i++) {
printf("ptr_arr[%d]指向的值: %d\n", i, *ptr_arr[i]);
}
return 0;
}
cpptemplate
#
模板声明语法
#
template<typename T> // 或 template<class T>
返回值类型 函数名(参数列表);
template<typename T>
class 类名 {
// 类定义
};
基本用法
#
template<typename T>
T max(T a, T b) {
return a > b ? a : b;
}
// 使用
int result = max<int>(5, 10); // 显式实例化
auto result2 = max(5.5, 3.14); // 隐式实例化
特化与重载
#
// 特化
template<>
const char* max<const char*>(const char* a, const char* b) {
return strcmp(a, b) > 0 ? a : b;
}
// 重载
template<typename T>
T max(T a, T b, T c) {
return max(max(a, b), c);
}
类模板基本语法
#
template<typename T>
class Vector {
private:
T* data;
size_t size;
public:
Vector(size_t n) : size(n), data(new T[n]) {}
~Vector() { delete[] data; }
T& operator[](size_t index) { return data[index]; }
};
成员函数模板
#
template<typename T>
class MyClass {
public:
template<typename U>
void process(U value) {
// 实现
}
};
类型参数
#
template<typename T> // 单个类型参数
template<typename T, typename U> // 多个类型参数
非类型参数
#
template<typename T, int Size>
class Array {
T data[Size];
};
// 使用
Array<int, 10> arr;
模板模板参数
#
template<template<typename> class Container, typename T>
class Adapter {
Container<T> data;
};
默认模板参数
#
template<typename T = int, int Size = 10>
class Buffer {
// 实现
};
全特化
#
template<>
class Vector<bool> {
// 针对bool类型的特殊实现
};
偏特化
#
template<typename T>
class Pointer<T*> {
// 针对指针类型的特殊实现
};
可变参数模板基本语法
#
template<typename... Args>
void print(Args... args) {
// 处理参数包
}
参数包展开
#
template<typename... Args>
void print(Args... args) {
(cout << ... << args); // C++17 折叠表达式
}
完美转发
#
template<typename... Args>
void forwarder(Args&&... args) {
some_function(std::forward<Args>(args)...);
}
SFINAE(Substitution Failure Is Not An Error)
#
template<typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
process(T value) {
return value * 2;
}
概念(Concepts)
#
template<typename T>
concept Integral = std::is_integral_v<T>;
template<Integral T>
T process(T value) {
return value * 2;
}
编译时计算
#
template<int N>
struct Factorial {
static const int value = N * Factorial<N-1>::value;
};
template<>
struct Factorial<0> {
static const int value = 1;
};
类型特征
#
template<typename T>
struct is_pointer {
static const bool value = false;
};
template<typename T>
struct is_pointer<T*> {
static const bool value = true;
};
友元模板
#
template<typename T>
class MyClass {
template<typename U>
friend class FriendClass;
};
模板别名(C++11)
#
template<typename T>
using MyVector = std::vector<T, MyAllocator<T>>;
变量模板(C++14)
#
template<typename T>
constexpr T pi = T(3.1415926535897932385);