C语言基础(十五)

2024-08-24 12:52
文章标签 语言 基础 十五

本文主要是介绍C语言基础(十五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

指针的使用:

测试代码1:
 

#include <stdio.h>  // 标准的 main 函数声明,包括可选的 envp 参数  
int main(int argc, char *argv[], char *envp[]) {  // argc 命令行参数的数量(包括程序名)  // argv 指向字符指针的指针数组,每个元素都是一个指向参数的字符串  // envp 指向环境变量的指针数组,每个元素都是一个指向环境字符串的指针 int time = getTime();// 打印程序名  printf("Program name: %s\n", argv[0]);  // 遍历命令行参数(除了程序名)  for (int i = 1; i < argc; i++) {  printf("Argument %d: %s\n", i, argv[i]);  }  // 通常不会在这里处理 envp,大多数程序中不是必需的。  // 如果需要访问环境变量 if (envp != NULL) {  for (int i = 0; envp[i] != NULL; i++) {  // 打印环境变量字符串,没有解析。 printf("Environment variable %d: %s\n", i, envp[i]);  }  }  return 0;  
}

运行结果如下:

 

测试代码2:

#include "date.h"
#include <stdio.h>  int main() {  int time = getTime();int a = 10;  int b = 20;  // 定义两个整数指针  int *ptr1 = &a;  int *ptr2 = &b;  // 二级指针,初始时指向ptr1  int **pptr = &ptr1;  const char *ptr = "Hello";const char **ptr_ptr = &ptr;printf("Value of ptr: %s\n", ptr);printf("Value of ptr_ptr: %s\n", *ptr_ptr);printf("Before change: *ptr1 = %d, *ptr2 = %d\n", *ptr1, *ptr2);  // 通过pptr改变ptr1的值,让它指向ptr2所指向的地址  *pptr = ptr2;  // ptr1现在指向的是ptr2所指向的地址  printf("After change: *ptr1 = %d, *ptr2 = %d\n", *ptr1, *ptr2);  return 0;  
}

运行结果如下:

 

测试代码3:

#include "date.h" 
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h> 
// 二级指针 
int main() {  int time = getTime();// 存储3个字符串  int numStrings = 3;  char **strings = (char **)malloc(numStrings * sizeof(char *));  // 检查malloc是否成功  if (strings == NULL) {  perror("Failed to allocate memory for strings");  return 1;  }  // 为每个字符串分配内存  for (int i = 0; i < numStrings; i++) {  strings[i] = (char *)malloc(50 * sizeof(char)); // 每个字符串最多49个字符加上一个'\0'  if (strings[i] == NULL) {  perror("Failed to allocate memory for a string");  // 释放之前分配的内存  for (int j = 0; j < i; j++) {  free(strings[j]);  }  free(strings);  return 1;  }  }  // 填充字符串  strcpy(strings[0], "Hello");  strcpy(strings[1], "World");  strcpy(strings[2], "C Programming");  // 通过二级指针访问和打印字符串  for (int i = 0; i < numStrings; i++) {  printf("%s\n", *(strings + i)); // 或者 strings[i]  }  // 释放内存  for (int i = 0; i < numStrings; i++) {  free(strings[i]);  }  free(strings);  return 0;  
}

运行结果如下:

 

测试代码4:

#include "date.h" 
#include <stdio.h>  int add(int a, int b) {  return a + b;  
}  int main() {  int time = getTime();// 基本数据类型的指针int var = 20;  int *ptr = &var;  printf("基本数据类型的指针: Value of var: %d, Value of *ptr: %d\n", var, *ptr);  *ptr = 22;  printf("修改后: Value of var: %d\n", var);  // 数组指针int arr[] = {10, 20, 30, 40, 50};  int *arrPtr = arr;  printf("数组指针: Value of arr[0]: %d, Value of arrPtr[0]: %d\n", arr[0], arrPtr[0]);  for (int i = 0; i < 5; i++) {  printf("arr[%d] = %d\n", i, *(arrPtr + i));  }  // 函数指针 int (*funcPtr)(int, int) = add;  int result = funcPtr(10, 20);  printf("函数指针: Result: %d\n", result);  // 二级指针(指针的指针)int var2 = 3000;  int *ptr2 = &var2;  int **pptr = &ptr2;  printf("二级指针: Value of var2: %d, Value of **pptr: %d\n", var2, **pptr);  **pptr = 4000;  printf("修改后: New value of var2: %d\n", var2);  return 0;  
}

运行结果如下:

 

测试代码5:

#include "date.h" 
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  // 函数声明  
int countSubstring(const char *str, const char *substr);  int main() {  int time = getTime();char *inputStr = NULL; // 使用NULL初始化指针  char *searchStr = NULL; // 使用NULL初始化指针  int length, capacity = 1024; // 设置初始容量  int count;  // 分配内存给主串  inputStr = (char *)malloc(capacity * sizeof(char));  if (inputStr == NULL) {  perror("内存分配失败");  return 1;  }  // 分配内存给子串  searchStr = (char *)malloc(capacity * sizeof(char));  if (searchStr == NULL) {  free(inputStr);  perror("内存分配失败");  return 1;  }  // 输入主串  printf("请输入主串: ");  fgets(inputStr, capacity, stdin);  // 去除fgets读取的换行符  inputStr[strcspn(inputStr, "\n")] = 0;  // 输入子串  printf("请输入子串: ");  fgets(searchStr, capacity, stdin);  // 去除fgets读取的换行符  searchStr[strcspn(searchStr, "\n")] = 0;  // 检查输入是否为空  if (strlen(inputStr) == 0 || strlen(searchStr) == 0) {  printf("输入不能为空!\n");  free(inputStr);  free(searchStr);  return 1;  }  // 统计子串在主串中出现的次数  count = countSubstring(inputStr, searchStr);  printf("'%s' 在 '%s' 中出现了 %d 次。\n", searchStr, inputStr, count);  // 释放内存  free(inputStr);  free(searchStr);  return 0;  
}  // 统计子串在主串中出现的次数  
int countSubstring(const char *str, const char *substr) {  int count = 0;  const char *tmp = str;  while ((tmp = strstr(tmp, substr)) != NULL) {  count++;  tmp++; // 移动到下一个字符,可能会错过重叠的子串  // 如果需要计算重叠子串,可以注释掉上面这行}  return count;  
}

运行结果如下:

 

 

 

 

 

这篇关于C语言基础(十五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102538

相关文章

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显