对 const char* const &a 的理解

本文详细解析了C++中引用与常量的概念及使用方法,特别是如何定义指针类型的引用及其限制条件,帮助读者深入理解这些核心概念。
定义中用到&是独立引用.
比如:
char i;
char &a=i;
表示a是i的一个单独引用.
当有i='a'时,也有a='a';
当有a='c'时,也有i='c';
两个变量的标示符都代表同一个内存空间地址.

声明中带有const时,表示为常量.
对const char* const &a=i从右读起
const &a表示a为常量,一开始要对其赋值,这里赋予i,表示a是i的一个单独引用.在以后的程序中,不能对a本身进行值的修改,即不允许有&a=othervaries 之类的赋值语句.

const char * const &a
是在const &a的基础上声明:const char *a,即对*a(a所指向的内容为常量,不可更改),在以后的程序中,不允许有这样的语句:*a=90;

所以整个声明可以理解为:a 是i的一个别名,且永远是i的别名(不会变成其它变量的别名).不能利用a来修改i的值.a只是对i的值的引用.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


定义一个char类型指针的引用

此指针为指针常量,并且此指针指向的也是常量字符

所以有指针指向的内容不能改,指针本身的值也不能改

  

#include #include #include #include #include #include // 动态数组结构 typedef struct { void *data; // 数据指针 size_t size; // 元素数量 size_t capacity; // 当前容量 size_t elemSize; // 元素大小 } DynamicArray; // 初始化动态数组 void initArray(DynamicArray *arr, size_t elemSize) { arr->data = NULL; arr->size = 0; arr->capacity = 0; arr->elemSize = elemSize; } // 添加元素到动态数组 void pushBack(DynamicArray *arr, void *element) { if (arr->size >= arr->capacity) { size_t newCapacity = (arr->capacity == 0) ? 4 : arr->capacity * 2; void *newData = realloc(arr->data, newCapacity * arr->elemSize); if (!newData) { fprintf(stderr, "内存分配失败\n"); exit(EXIT_FAILURE); } arr->data = newData; arr->capacity = newCapacity; } // 添加新元素 void *dest = (char*)arr->data + arr->size * arr->elemSize; memcpy(dest, element, arr->elemSize); arr->size++; } // 释放动态数组内存 void freeArray(DynamicArray *arr) { free(arr->data); arr->data = NULL; arr->size = arr->capacity = 0; } // 冒泡排序实现 void bubbleSort(DynamicArray arr, int (compare)(const void, const void)) { if (arr->size <= 1) return; for (size_t i = 0; i < arr->size - 1; i++) { bool swapped = false; for (size_t j = 0; j < arr->size - i - 1; j++) { void *elem1 = (char*)arr->data + j * arr->elemSize; void *elem2 = (char*)arr->data + (j + 1) * arr->elemSize; if (compare(elem1, elem2) > 0) { // 交换元素 char temp[arr->elemSize]; memcpy(temp, elem1, arr->elemSize); memcpy(elem1, elem2, arr->elemSize); memcpy(elem2, temp, arr->elemSize); swapped = true; } } // 如果没有交换发生,提前结束 if (!swapped) break; } } // 比较函数:整型 int intCompare(const void a, const void b) { return ((int)a - (int)b); } // 比较函数:浮点型 int floatCompare(const void *a, const void *b) { float diff = (float)a - (float)b; if (diff > 0.0001) return 1; // 考虑浮点精度 if (diff < -0.0001) return -1; return 0; } // 比较函数:字符型 int charCompare(const void a, const void b) { return ((char)a - (char)b); } // 打印数组 void printArray(DynamicArray *arr, void (printFunc)(void)) { printf(“[”); for (size_t i = 0; i < arr->size; i++) { void elem = (char)arr->data + i * arr->elemSize; printFunc(elem); if (i < arr->size - 1) printf(“, “); } printf(”]\n”); } // 打印整型元素 void printInt(void *elem) { printf(“%d”, (int)elem); } // 打印浮点型元素 void printFloat(void *elem) { printf(“%.2f”, (float)elem); } // 打印字符型元素 void printChar(void *elem) { printf(“‘%c’”, (char)elem); } // 解析用户输入行 void parseInputLine(DynamicArray *arr, const char input, void (parseFunc)(DynamicArray, const char)) { parseFunc(arr, input); } // 解析整型输入 void parseInt(DynamicArray *arr, const char *input) { char *token; char *copy = strdup(input); // 创建可修改的副本 char *ptr = copy; while (*ptr) { // 跳过非数字字符 while (*ptr &amp;&amp; !isdigit(*ptr) &amp;&amp; *ptr != '-') ptr++; if (!*ptr) break; // 尝试解析数字 char *end; int value = strtol(ptr, &amp;end, 10); if (end != ptr) { // 成功解析 pushBack(arr, &amp;value); ptr = end; } else { ptr++; } } free(copy); } // 解析浮点型输入 void parseFloat(DynamicArray *arr, const char *input) { char *token; char *copy = strdup(input); char *ptr = copy; while (*ptr) { // 跳过非数字字符 while (*ptr &amp;&amp; !isdigit(*ptr) &amp;&amp; *ptr != '-' &amp;&amp; *ptr != '.') ptr++; if (!*ptr) break; // 尝试解析浮点数 char *end; float value = strtof(ptr, &amp;end); if (end != ptr) { // 成功解析 pushBack(arr, &amp;value); ptr = end; } else { ptr++; } } free(copy); } // 解析字符型输入 void parseChar(DynamicArray *arr, const char *input) { for (const char *p = input; *p != ‘\0’; p++) { if (!isspace(*p)) { char value = *p; pushBack(arr, &amp;value); } } } // 随机生成数组 void generateRandomArray(DynamicArray *arr, int dataType, int size) { srand(time(NULL)); for (int i = 0; i < size; i++) { if (dataType == 1) { // 整型 int value = rand() % 100; // 0-99的随机数 pushBack(arr, &amp;value); } else if (dataType == 2) { // 浮点型 float value = (rand() % 1000) / 10.0f; // 0.0-99.9的随机浮点数 pushBack(arr, &amp;value); } else if (dataType == 3) { // 字符型 char value = 'A' + rand() % 26; // A-Z的随机字符 pushBack(arr, &amp;value); } } } #include #include #include #include #include #include // 二分法查找函数 bool binarySearch(DynamicArray *arr, void target, int (compare)(const void, const void)) { size_t left = 0; size_t right = arr->size - 1; while (left <= right) { size_t mid = (left + right) / 2; void *midElem = (char*)arr->data + mid * arr->elemSize; int cmp = compare(midElem, target); if (cmp == 0) { return true; // 找到了目标 } else if (cmp < 0) { left = mid + 1; // 向右半部分搜索 } else { right = mid - 1; // 向左半部分搜索 } } return false; // 没有找到目标 } // 主程序入口 int main() { int choice; char buffer[256]; while (1) { printf("\n===== 二分法查找程序 =====\n"); printf("1. 整型查找\n"); printf("2. 浮点型查找\n"); printf("3. 字符型查找\n"); printf("4. 退出程序\n"); printf("请选择操作: "); if (fgets(buffer, sizeof(buffer), stdin) == NULL) break; if (sscanf(buffer, "%d", &amp;choice) != 1) continue; if (choice == 4) break; // 初始化动态数组 DynamicArray arr; void (*printFunc)(void*) = NULL; int (*compareFunc)(const void*, const void*) = NULL; void (*parseFunc)(DynamicArray*, const char*) = NULL; switch (choice) { case 1: // 整型 initArray(&amp;arr, sizeof(int)); printFunc = printInt; compareFunc = intCompare; parseFunc = parseInt; break; case 2: // 浮点型 initArray(&amp;arr, sizeof(float)); printFunc = printFloat; compareFunc = floatCompare; parseFunc = parseFloat; break; case 3: // 字符型 initArray(&amp;arr, sizeof(char)); printFunc = printChar; compareFunc = charCompare; parseFunc = parseChar; break; default: printf("无效选择!\n"); continue; } // 从用户获取数组输入 printf("输入数组元素(空格或逗号分隔): "); if (fgets(buffer, sizeof(buffer), stdin)) { buffer[strcspn(buffer, "\n")] = '\0'; // 移除换行符 parseInputLine(&amp;arr, buffer, parseFunc); } // 对数组进行排序,确保有序 bubbleSort(&amp;arr, compareFunc); // 打印排序后的数组 printf("\n排序后的数组: "); printArray(&amp;arr, printFunc); // 查找目标值 printf("\n输入查找的目标值: "); fgets(buffer, sizeof(buffer), stdin); bool found = false; if (choice == 1) { // 整型查找 int target; sscanf(buffer, "%d", &amp;target); found = binarySearch(&amp;arr, &amp;target, compareFunc); } else if (choice == 2) { // 浮点型查找 float target; sscanf(buffer, "%f", &amp;target); found = binarySearch(&amp;arr, &amp;target, compareFunc); } else if (choice == 3) { // 字符型查找 char target; target = buffer[0]; // 读取首字符 found = binarySearch(&amp;arr, &amp;target, compareFunc); } // 输出查找结果 if (found) { printf("\n查找结果: 找到目标值!\n"); } else { printf("\n查找结果: 未找到目标值!\n"); } // 清理资源 freeArray(&amp;arr); // 询问是否继续 printf("\n继续查找? (y/n): "); if (fgets(buffer, sizeof(buffer), stdin) &amp;&amp; (buffer[0] == 'n' || buffer[0] == 'N')) { break; } } return 0; } 修改代码规范,注释不能出现英文,不能有//注释
最新发布
09-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值