当前位置: 首页 > 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

          

http://www.lryc.cn/news/138037.html

相关文章:

  • TCP网络连接异常情况的处理
  • 单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.10语句
  • Windows 通过服务名称搜索软件启动路径启动软件
  • 如何更高效的写出更健全的代码,一篇文章教会你如何拥有一个良好的代码风格
  • Java如何调用接口API并返回数据(两种方法)
  • 极狐GitLab 价值流管理之「总时间图」使用指南
  • Mybatis入门和环境搭建
  • React 全栈体系(二)
  • 【Linux】socket编程(二)
  • 七大出海赛道解读,亚马逊云科技为行业客户量身打造解决方案
  • 【Maven教程】(三)基础使用篇:入门使用指南——POM编写、业务代码、测试代码、打包与运行、使用Archetype生成项目骨架~
  • Spring Boot + Spring Data JPA 实现数据库操作的标准示例
  • JVM——类加载器
  • async/await 编程理解
  • 1. Java基础知识介绍
  • 基础shell小技巧01
  • 微信小程序--data的赋值与取值的几种方式
  • 条码通讯配置
  • 知网G4期刊《高考》简介及投稿要求
  • 第7章 CPU前端优化
  • idea新建Java-maven项目时,出现Dependency‘xxx(jar包名)‘ not found的解决方案
  • STM32--USART串口
  • 2023年Java毕业设计题目推荐,怎样选题?500道毕业设计题目推荐
  • 基于数据湖的多流拼接方案-HUDI概念篇
  • OpenCV基础知识(5)— 几何变换
  • Linux下源码安装MySQL 8.0
  • 大聪明教你学Java | 深入浅出聊 Java 内存模型
  • SAP ABAPG开发屏幕自动生成日期的搜索帮助
  • leetcode 674. 最长连续递增序列
  • Mysql简短又易懂