当前位置: 首页 > news >正文

C 语言学习

  1. 数组的指针 

                    在c中,几乎所以使用数组名的表达式中,数组名的值是一个指针常量,也就是数组               第   一个元素的地址。注意这个值是指针常量,不是变量。 

           int  a[10]={   ….....}; 

           int    *q; 

           q=&a[0] ;   <=>  q=a;    //这两句是等价的。 

    

           但是,a=q   是非法的,因为a是常量。 

           a[5]=*(q+5)       //数组下标等价于数组的指针间接寻址。 

          int    a[10]={….....}; 

          int   *p=a;      //一定要理解,非常重要。 

          注意  int   *p    是定义的p为整型指针变量,如初始化必须是指针类型值。 

           如: 

           char   c='a'; 

           char    *q= &c; 

           特别要理解字符串常量这个特殊情况:

           char   *q="hello world.";          //"hello world" 的值为存储这个字符串常量的地址指针。

           到现在就可以很好理解scanf输入什麽时候加&符号了

            如:

            char   c[10];

            int    t;

            scanf("%d",&t);      //注意t前面必须加& 地址符号。

            scanf("%s",c);        //因为c就是指针类型。同样。printf("%s",a) a也是指针类型。

            c语言中,任何字符串常量的值的类型都是指针类型。

           所以,只有见到函数参数是  char  *  或者const   char  *   就是要输入字符串。

          如:c中打开文件的函数    

                   FILE  *  fopen(const   char   *restrict, const  char  *restrict)

                   此函数的意思就是函数返回值为FILE类型的存储指针,如打开成功,返回打开文件运行代码的内存地址指针,失败,返回NULL。  参数1为文件路径名加文件名,用字符串常量表示,如"/home/wjs/2.c",  参数2 为字符串常量,如" r" ,  "w","a","r+","w+","a+",表示读写方式。     

          c语言中规定:关于函数参数,在函数原型或函数定义的场合中(并且也只有在这两种场合中),可以用 int  *p 代替 int  p[ ]  

           fun( int  *p)         <==>   fun (int  p[ ])     等价

#include <stdio.h>
#include <string.h>
#define A "hello world."

int test(int *p);
int main(void){
    int t[10]={1,2,3,4,5,6};
        test(t);    
    return 0;
       

}
int test(int *p){
    printf("%d\n",p[3]);       //4
    printf("%d\n",*(p+3));     //4
    return 0;
}
 

2.       #define    A      B        把b自定义 A 

          如定义字符串:   #define    HELLO    "hello   world" 

           定义数值               #define     LEN       10 

3.       const     修饰,表示不可变 

          const    int   t[10]         不可变数组 

         const     int  t=10         不可变变量 

4.    c 语言的字符串就是以\0结尾的char数组。

       字符串常量或者叫字符串文字是指用一对双括号包围的任何字符,系统自动加\0.

          

        <1> c语言的字符串定义:

         先定义字符串 c :       char   c [ 20]={..........  ,'\0'};

         程序中可以直接用c  代表字符串了

        <2>  字符串常量的定义

           a:    #define    A    ”hello world."

           b:   char  c[20]="hello  world."

           c:   char  *p="hello  world"        //特别要理解,这里赋值是字符串常量的地址指针。可以参看下面的代码理解

          printf("%c\n", *"hello");    //   输出 h,"hello" 的值为字符串hello内存存储地址的指针。

  char *p="hello world.";
        for(int n=0;n<strlen(p);n++){
        printf("%c\n",*p);
        p++;
    }

     输出为  h   e  l    l  o   

scanf   输入时系统自动加如\0 空白符。printf  函数可以直接输出 字符串数组。如不加空白符,那是字符数组 .printf() 也能直接输出 字符数组。这和java  输出数组就有区别。

         char   c[20];

          scanf("%s",c);

          printf("%s\n",c);      //直接输出。

5     键盘输入:

        a.    char  c=getchar()    //一个字符的输入

        b.    char  c[20];     gets(c);         //一个字符串的输入,可以包括空格等,不推荐使用。

        c.    char c[20];  char  *p;   p=fgets(c,20,stdin);    //输入一个字符串,推荐用。

        d.   char c[20];    scanf("%s",c)    //可以输入字符串。整数。浮点数,字符等

6.    屏幕输出

      a.  putchar('a');             //输出一个字符

      b.  puts(&);          //& 表示输出字符串的地址指针

           如: puts("hello");

                    char   *p="hello";    puts(p+1); //ello

     c.  char c[20]="hello";   fputs(c,stdout);

     d.  printf(  )

========================================================

c  服务器与客户端 for deepin

服务器:

  

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char *message);int main(int argc,char *argv[]){int serv_sock;int clnt_sock;struct sockaddr_in  serv_addr;struct sockaddr_in  clnt_addr;socklen_t   clnt_addr_size;char message[]="hello nanning";if(argc!=2){printf("Usage:%s <port>\n",argv[0]);exit(1);}serv_sock=socket(PF_INET,SOCK_STREAM,0);if(serv_sock==-1)error_handing("socket() error");memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);serv_addr.sin_port=htons(atoi(argv[1]));struct sockaddr *myaddr=&serv_addr;	if(bind(serv_sock,myaddr,sizeof(serv_addr))==-1)error_handing("bind() error|port binding");if(listen(serv_sock,5)==-1)error_handing("listen() error");printf("%s\n","listening port");clnt_addr_size=sizeof(clnt_addr);struct sockaddr *myclnt=&clnt_addr;clnt_sock=accept(serv_sock,myclnt,&clnt_addr_size);if(clnt_sock==-1)error_handing("accept() error");write(clnt_sock,message,sizeof(message));close(clnt_sock);close(serv_sock);return 0;
}
void error_handing(char *message){fputs(message,stderr);fputc('\n',stderr);exit(1);
}

客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handing(char *message);int main(int argc,char *argv[]){int sock;struct sockaddr_in serv_addr;char message[30];int str_len;if(argc!=3){printf("Usage:%s <ip> <port>\n",argv[0]);exit(1);}sock=socket(PF_INET,SOCK_STREAM,0);if(sock==-1)error_handing("socket() error");memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=inet_addr(argv[1]);serv_addr.sin_port=htons(atoi(argv[2]));struct sockaddr *myaddr=&serv_addr;if(connect(sock,myaddr,sizeof(serv_addr))==-1)error_handing("connect() error");str_len=read(sock,message,sizeof(message)-1);if(str_len==-1)error_handing("read() error");printf("message from server:%s\n",message);close(sock);return 0;
}
void error_handing(char *message){fputs(message,stderr);fputc('\n',stderr);exit(1);
}

      服务器:./ s    3000

      客户端: ./c    127.0.0.1     3000

          

相关文章:

C 语言学习

数组的指针 在c中&#xff0c;几乎所以使用数组名的表达式中&#xff0c;数组名的值是一个指针常量&#xff0c;也就是数组 第 一个元素的地址。注意这个值是指针常量&#xff0c;不是变量。 int a[10]{ ….....}; int *q; q&a[0] ; <>…...

TCP网络连接异常情况的处理

在网络连接中&#xff0c;经常会出现一些意外情况&#xff0c;导致TCP连接不能正常工作&#xff0c;对于这些意外情况&#xff0c;TCP内部有自己的解决方法 一.进程崩溃 在网络通讯时可能会出现进程突然崩溃的情况&#xff0c;当进程崩溃后进程就没了&#xff0c;就会导致进程…...

单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.10语句

1 表达式语句 表达式语句由表达式加上分号“;”组成。其一般形式为&#xff1a; 表达式; 执行表达式语句就是计算表达式的值。例如 caa; 2 函数调用语句 由函数名、实际参数加上分号“;”组成。其一般形式为&#xff1a; 函数名(实际参数表); 例如 printf(“Hello !”);…...

Windows 通过服务名称搜索软件启动路径启动软件

文章目录 Windows 通过服务名称搜索软件启动路径启动软件 Windows 通过服务名称搜索软件启动路径启动软件 注意&#xff1a;QQ管家和360安全&#xff0c;正常情况下使用 taskkill 无法停止&#xff0c;因为在安全设置中有个“自保护”&#xff0c;正常情况下会默认勾选上&#…...

如何更高效的写出更健全的代码,一篇文章教会你如何拥有一个良好的代码风格

前言&#xff1a;在平常的写代码的过程中&#xff0c;或多或少的遇到很多奇怪的 bug &#xff0c;尤其是一些大的程序&#xff0c;明明上一部分都是好好的&#xff0c;写下一块的时候突然多几百个 bug 的情况&#xff0c;然后这一块写完了后编译的时候直接傻眼了&#xff0c;看…...

Java如何调用接口API并返回数据(两种方法)

Java如何调用接口API并返回数据&#xff08;两种方法&#xff09; java处理请求接口后返回的json数据-直接处理json字符串 处理思路&#xff1a; 将返回的数据接收到一个String对象中&#xff08;有时候需要自己选择性的取舍接收&#xff09; 再将string转换为JSONObject对象 …...

极狐GitLab 价值流管理之「总时间图」使用指南

本文来源&#xff1a;about.gitlab.com 作者&#xff1a;Haim Snir 译者&#xff1a;极狐(GitLab) 市场部内容团队 对于软件研发管理者来说&#xff0c;了解在整个研发过程中时间都耗费在了哪些地方&#xff0c;是进行交付价值优化的关键洞察。GitLab / 极狐GitLab 新的价值流分…...

Mybatis入门和环境搭建

文章目录 一. Mybatis的简介1. 什么是ORM?2. 什么是持久层&#xff1f;3. Mybatis的作用 二. Mybatis环境搭建1. 搭建一个数据库2. 创建maven项目并导入相关依赖3. Mybatis相关插件安装4. Mybatis.cfg.xml核心配置文件 三. 基于ssm逆向工程的使用1. 配置generatorConfig.xml2.…...

React 全栈体系(二)

第二章 React面向组件编程 一、基本理解和使用 1. 使用React开发者工具调试 2. 效果 2.1 函数式组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_函数式组件</title> </head> &l…...

【Linux】socket编程(二)

目录 前言 TCP通信流程 TCP通信的代码实现 tcp_server.hpp编写 tcp_server.cc服务端的编写 tcp_client.cc客户端的编写 整体代码 前言 上一章我们主要讲解了UDP之间的通信&#xff0c;本章我们将来讲述如何使用TCP来进行网络间通信&#xff0c;主要是使用socket API进…...

七大出海赛道解读,亚马逊云科技为行业客户量身打造解决方案

伴随全球化带来的新机遇和国内市场的进一步趋于饱和&#xff0c;近几年&#xff0c;中国企业出海快速升温&#xff0c;成为了新的创业风口和企业的第二增长曲线。从范围上看&#xff0c;出海市场由近及远&#xff0c;逐步扩张。从传统的东南亚市场&#xff0c;到成熟的北美、欧…...

【Maven教程】(三)基础使用篇:入门使用指南——POM编写、业务代码、测试代码、打包与运行、使用Archetype生成项目骨架~

Maven基础使用篇 1️⃣ 编写 POM2️⃣ 编写业务代码3️⃣ 编写测试代码4️⃣ 打包和运行5️⃣ 使用 Archetype生成项目骨架 1️⃣ 编写 POM 到目前为止&#xff0c;已经大概了解并安装好了Maven环境, 现在&#xff0c;我们开始创建一个最简单的 Hello World 项目。如果你是初次…...

Spring Boot + Spring Data JPA 实现数据库操作的标准示例

环境搭建 本篇使用H2内存数据库演示Spring Data JPA 的使用。 导入JPA和H2的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><…...

JVM——类加载器

回顾一下类加载过程 类加载过程&#xff1a;加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 一个非数组类的加载阶段&#xff08;加载阶段获取类的二进制字节流的动作&#xff09;是可控性最强的阶段&#xff0c;这一步我们可以去完成还可以自定义…...

async/await 编程理解

博客主要是参考 Asynchronous Programming in Rust &#xff0c;会结合简单的例子&#xff0c;对 async 和 await 做比较系统的理解&#xff0c;如何使用 async 和 await 是本节的重点。 async 和 await 主要用来写异步代码&#xff0c;async 声明的代码块实现了 Future 特性&a…...

1. Java基础知识介绍

文章目录 1. Java基础知识介绍1. 简单输入输出1.1 输入1.2 输出 2. 数据类型2.1 基本数据类型2.2 引用数据类型 3. 函数4. 类基础知识5. 小结 1. Java基础知识介绍 1. 简单输入输出 在Java编程中&#xff0c;我们经常需要与用户进行交互&#xff0c;以获取输入并输出结果。Ja…...

基础shell小技巧01

1. 命令替换 shell脚本中最有用的特性之一是可以从命令输出中提取信息并将其赋给变量。把输出赋给变量之后&#xff0c;就可以随意在脚本中使用了。在脚本中处理数据时&#xff0c;这个特性显得尤为方便。 有两种方法可以将命令输出赋给变量。 反引号&#xff08;&#xff0…...

微信小程序--data的赋值与取值的几种方式

通过小程序官方文档可知&#xff1a; 赋值一定需要注意。需要setData的使用&#xff0c;这样页面才刷新&#xff0c;数据才会改变&#xff0c;并且分清that和this的使用 Page() 函数用来注册一个页面。接受一个 object 参数&#xff0c;其指定页面的初始数据、生命周期函数、事…...

条码通讯配置

由Leuze&#xff08;劳易测&#xff09; LSIS 222 M5M-R1/MA208i系统组成 连接说明及器件明细&#xff1a; 打开条码调试软件BPS Configuration tool对M208i进行ip 和端口号进行配置&#xff0c;条码选择作为客户端&#xff0c;输入ip和端口号&#xff0c;选择串口通讯波特…...

知网G4期刊《高考》简介及投稿要求

知网G4期刊《高考》简介及投稿要求 一、《高考》期刊简介&#xff1a; 主管单位&#xff1a;长春市委宣传部 主办单位&#xff1a;长春出版社 国内刊号22-1372/G4 国际刊号1673-6265 代号12-240 编辑单位&#xff1a;《高考》杂志社 出版周期&#xff1a;旬刊 类 …...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...