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

【c1】数据类型,运算符/循环,数组/指针,结构体,main参数,static/extern,typedef

文章目录

  • 1.数据类型:编译器(compiler)与解释器(interpreter),中文里的汉字和标点符号是两个字节,不能算一个字符(单引号)
  • 2.运算符/循环:sizeof/size_t
  • 3.数组:存数据类型相同的数据,数组下标越界导致段错误
  • 4.指针:指针数组:这个数组的所有元素都是指针类型。数组指针:这个指针存放着一个数组的首地址
    • 4.1 地址/值/变量名:p是地址,*p是指向的内容,01指0x01,&a:拿变量a的地址赋给
    • 4.2 函数调用:复制a/指向a
    • 4.3 函数返回:复制指针
    • 4.4 数组和指针转换:指针转不了数组,数组可转为指针,&取地址
    • 4.5 字符串str相关:putchar('w');putchar('w');
  • 5.结构体:存放一组不同数据类型的数据
  • 6.main函数的参数:main函数的参数是从命令提示符下执行程序时传入
  • 7.static/inline/回调/extern/堆内存:inline内联函数本身就是static(本文件私有)函数,inline函数在c中作用性不高,c中用习惯了宏定义
  • 8.typedef:define仅仅是简单的字符串的替换,而typedef则给这个类型新起了一个名字
    • 8.1 给已定义的变量类型起个别名:给struct __person起了个别名person_t
    • 8.2 定义函数指针类型:必须用typedef,方法就是在“定义函数指针变量”前加上typedef
    • 8.3 定义数组指针类型:先看如何定义数组指针变量
    • 8.4 定义数组类型:声明一个含5个int元素的一维数组:int a[5]


1.数据类型:编译器(compiler)与解释器(interpreter),中文里的汉字和标点符号是两个字节,不能算一个字符(单引号)

编译型语言:C/C++/golang/rust:并且都是AOT(ahead of time)预先编译,编译将源码编译成机器码生成二进制文件,可直接运行该文件,因为是机器码,所以运行效率很高。缺点:不够灵活,改代码要重新编译,此外平台依赖,linux平台编译出来的二进制文件无法在windows运行,跨平台还需借助交叉编译。

解释型语言:python/js/php:不需要生成二进制文件,灵活如线上php系统,改了代码功能直接生效,但运行效率低。

半解释半编译型语言:java:JIT将运行到的代码块在运行时编译成机器码,既可保证跨平台性,又能使热代码高效运行。

C库函数声明头文件(.h):存放在/usr/include目录中,如果 #include <facebook/cJSON.h>,则cJSON.h在/usr/include/facebook/目录里。如下github上软件包(devtool search),在image.bb中添加hiredis软件包查找hiredis.bb文件【内容有git网址】在yocto或common或meta-aspeed或meta-phosphor文件夹中,.h文件会在/usr/include/中,但rootfs中看不到。
在这里插入图片描述
C库函数定义(具体实现)文件(.c):gcc编译不用包含libgcc.a(缺省会包含),/usr/lib/gcc/x86_64…/4.4.4/libgcc.a(打包好的静态库)。

gcc main.c int_sum.c float_sum.c    -o main -Wall(显示所有警告)    -I../include(-I后面没空格,不加-I就在main.c中指定头文件的相对路径)
gcc main.c   -o main -Wall     -I../include      -L../lib     -lsum(有库文件/lib/libsum.so就只要main.c就行)

2个字节的-480在计算机中为0xfe20,ipmitool发指令:低位在前即0x20 0xfe。
在这里插入图片描述
先确定字节数,再将最高位1固定。错误显示:100…010。正确存储:11…110。计算用正确存储。
在这里插入图片描述

num=5 # 0000 0101
result=$((~num))  # 得到: 1111 1010
echo $result  # -6  # 负数在计算机中存储是取反加1,1000 0101 + 1 = 1000 0110(-6 错误显示)
# 所以~作用是不管符号位,加1作用: 0000 0101 + 1 = 6num=-5 # 不是错误显示:1000 0101 ,是补码取反加1 :1111 1011
result=$((~num))  # 得到: 0000 0100
echo $result  # 4

在这里插入图片描述
浮点数不是2的0次方+2的1次方…,最小可识别精度和浮点数即0.1本身大小相关,而不是和float相关。
在这里插入图片描述
计算机中以字节为单位存储数据,1字节Byte=8bit,int=int32_t。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
d:十进制。o:八进制。x:十六进制。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

int main()
{int value = 1;char str[10] = "-q1"; // NA:0 , -1:-1 , 1:1 , q1:0value = atoi(str);    //字符串转换为整数(不是ascii码), strtolprintf("%d\n",value); //0
}
#define PLATFORM_NAME_PATH      "./a.py"
void get_machine_ver(char * result)
{char buffer[32] = {0};char cmd[128] = {0};strcpy(cmd, "python3 ");strcat(cmd, PLATFORM_NAME_PATH);FILE* file = popen(cmd, "r");if (file == NULL) {return;}// memset(buffer, '\0', sizeof(buffer));fgets(buffer, sizeof(buffer), file);printf("111,%ld\n",sizeof(buffer));  // 32   // char buffer[32] = {0};printf("222,%ld\n",strlen(buffer));  // 14 连换行符strncat(result, buffer, strlen(buffer)-1); // 去除换行符  // memcpy(result, buffer, strlen(buffer)-1); result长度不知,请确保 result 缓冲区足够大,以容纳 buffer 中的数据,并且不会发生缓冲区溢出的情况。// while (fgets(buffer, 10, file) != NULL) {//     strcat(result, buffer);// }pclose(file);return;
}int main(){char result[32] = {0};get_machine_ver(result);printf("333,%s",result); // 333, HP1-2C4F-0..
}

1.数据输出:在C语言中,有三个函数可以把数据输出到屏幕。
putchar 用于输出单个字符。
puts 输出字符串。

2.输出整数
输出的整数常量或整数变量用%d表示,在参数中列出待输出的整数常量或整数变量。
int age=18;
printf(“我年龄是%d岁。\n”,age);

3.输出字符
输出的字符常量或字符变量用%c表示,在参数中列出待输出的字符常量或字符变量。
char xb=‘x’;
printf(“我姓别是:%c。\n”,xb);

4.输出浮点数
输出的浮点型常量或浮点型变量用%lf表示,在参数中列出待输出的浮点型常量或浮点型变量。
double weight=62.5;
printf(“我体重是%lf公斤。\n”, weight);

5.输出字符串
输出的字符串常量或字符串型变量用%s表示,在参数中列出待输出的字符串常量或字符串变量。
char name[21];
memset(name,0,sizeof(name));
strcpy(name, “豫让”);
printf(“我的姓名是%s。\n”,name);

关键字:共32个,也就是说这些单词在C语言中有特别的含义,程序员不能把它用于变量或函数的命名。auto :声明自动变量。break:跳出当前循环。case:开关语句分支。char :声明字符型变量或函数返回值类型。const :声明只读变量。continue:结束当前循环,开始下一轮循环。default:开关语句中的“默认”分支。do :循环语句的循环体。double :声明双精度浮点型变量或函数返回值类型。else :条件语句否定分支(与 if 连用)。enum :声明枚举类型。extern:声明变量或函数是在其它文件或本文件的其他位置定义。float:声明浮点型变量或函数返回值类型。for:一种循环语句。goto:无条件跳转语句。if:条件语句。int: 声明整型变量或函数。long :声明长整型变量或函数返回值类型。register:声明寄存器变量。return :子程序返回语句(可以带参数,也可不带参数)。short :声明短整型变量或函数。signed:声明有符号类型变量或函数。sizeof:计算数据类型或变量长度(即所占字节数)。static:声明静态变量。struct:声明结构体类型。switch:用于开关语句。typedef:用以给数据类型取别名。unsigned:声明无符号类型变量或函数。union:声明共用体类型。void:声明函数无返回值或无参数,声明无类型指针。volatile:说明变量在程序执行中可被隐含地改变。while:循环语句的循环条件。

2.运算符/循环:sizeof/size_t

|| 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行,和c语言逻辑或相同。
在这里插入图片描述
如下ii++就是ii=ii+1。前先加1。
在这里插入图片描述
=是赋值,==才是判断两个数是否相等,C语言没有(之间)的关系运算符,如年龄在25-30岁之间:年龄大于等于25岁并且年龄小于等于30岁。

sizeof运算符(不是函数)计算某一个变量在当前系统的内存中所需占用的字节数:
1.用于数据类型:sizeof(int)) = 4,sizeof(指针)大小永远是8字节。
2.用于变量:sizeof使用形式:sizeof(var_name)或sizeof var_name。

sizeof结果类型是size_t:typedef unsigned int size_t为无符号整型,长度为4个字节(32位系统)。typedef unsigned long size_t为无符号长整型,长度为8个字节(64位系统)。ssize_t是有符号整型(在32位机器上等同int,在64位机器上等同long int)。

不要在if(判断条件)后面加分号。有;号就为空语句,下面都执行。c=(a>b)?a:b等同于两行:if(a>b) c=a;else c=b; if(0)即0假。if(a=b)是赋值,不是判断。当没有default时,如果所有case都匹配失败,则什么都不执行。char day=0,scanf(‘%c’',&day),case ‘0’。
在这里插入图片描述

#include<stdio.h>
int main()
{int a=1, b=2, re;char c;scanf("%c", &c);switch(c){case '+':re = a + b;break;case '#':{int other = 3;   // switch语句里定义了新的变量 ,加{}re = a + b + other;break;}default:printf("Illegal input!\n");break;}printf("%d\n", re);
}$gcc -o main *.c -lm
$main
Illegal input!
0

在这里插入图片描述
while(真)执行,continue跳到循环首部,break跳出循环。
在这里插入图片描述
在这里插入图片描述
如下do-while先执行一次循环。
在这里插入图片描述

for(i=0;i<10;i++)
{printf("%d\n",i); //没有下行0-9,有下行一直0i--;
}

3.数组:存数据类型相同的数据,数组下标越界导致段错误

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如下如果用msg[1],虽然越界了,但是系统给结构体分配很多字节,所以不报错。可用msg[0]到msg[n-1]。
在这里插入图片描述

4.指针:指针数组:这个数组的所有元素都是指针类型。数组指针:这个指针存放着一个数组的首地址

4.1 地址/值/变量名:p是地址,*p是指向的内容,01指0x01,&a:拿变量a的地址赋给

在这里插入图片描述

#include<stdio.h>char str[10];
char strbuf[10];
char *a(void)
{FILE *fp=0;if ((fp=fopen("a","rt")) ==0)  //a文件里写了 333aaa{printf("111");}if (fgets(strbuf, 10, fp) == NULL) {printf("222");fclose(fp);}strcpy(str,"B");strcat(str,strbuf);fclose(fp);return str;
}int main()
{char *b=a();printf("%s\n", b);  // B333aaa
}int main()
{FILE *fp=0;if ((fp = fopen("/tmp/bbb","r")) == 0){printf("file do not exist\n");fclose(fp); // Segmentation fault (core dumped),fp不存在不能close,上行没打印出是因为fclose报错早于printfreturn -1;}fclose(fp); // 走不到return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{int len,i=0;char * pid_name_config_1[] = {"GPU111111110","CPU0_DIMM0","MOC2.5_CPU"};printf("000,%s\n",pid_name_config_1[0]);  // 000,GPU111111110printf("111,%ld\n",sizeof(pid_name_config_1[0])); // 111,8(指针大小)printf("222,%ld\n",sizeof(pid_name_config_1)); // 222,24(3*8)len = (sizeof(pid_name_config_1)/sizeof(pid_name_config_1[0]));printf("333,%d\n",len); // 333,3printf("444,%ld\n",sizeof("GPU0")); // 444,5(最后\0结束符)printf("555,%ld\n",strlen("GPU0")); // 555,4char pid_name[20]={0};  // char pid_name[20][20]={0}; 可以,每一行用来存字符串,不是字符for(i=0; i<len; i++){strcpy(pid_name[i], pid_name_config_1[i]); // 错误,strcpy参数expected ‘char * restrict’ but argument is of type ‘charmemcpy(pid_name[i], pid_name_config_1[i], strlen(pid_name_config_1[i])); // 同上printf("666,%s\n", pid_name[i]);}
}

int *p 未赋值的指针称为野指针(危险),a=100,p=&a指向合法区域。或如下空指针的两种写法也可防止野指针。
在这里插入图片描述

4.2 函数调用:复制a/指向a

在这里插入图片描述
1.如下main中走到increament跳到这函数中,拷贝一份给increament中的a。main中的a和increament中的a各自独立一块内存,只是名字一样。
在这里插入图片描述
2.一定要通过increasement函数对a有修改怎么办?如下必须用到指针,increament运行结束后指针销毁。
在这里插入图片描述
在这里插入图片描述

4.3 函数返回:复制指针

如下当调用move_p时,p要往右移一位:move_p参数定义虽是指针,但调用时传入也是指针,复制一份。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.4 数组和指针转换:指针转不了数组,数组可转为指针,&取地址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.5 字符串str相关:putchar(‘w’);putchar(‘w’);

#include <stdio.h>
#include <string.h>
int main()
{char *names = "PSU";if(strcmp(names,"PSU")==0){puts("aaaa");  // 打印出}
}int main() {   // error: expected ‘)’ before string constant    少了int main()char name_str[30];char name_str1[30];strcpy(name_str,"/sys/bus/i2c/devices/");strcpy(name_str1,"17-0064");strcat(name_str,name_str1);printf("is : %s\n", name_str);   // /sys/bus/i2c/devices/17-0064  // printf("[%s]__%4d__[%s]  %s \n", __FILE__, __LINE__, __FUNCTION__, n->name);
}
#include <stdio.h>
#include <string.h>
int main ()
{char str1[15];char str2[15];int ret;strcpy(str1, "abcdef");strcpy(str2, "ABCDEF");ret = strcmp(str1, str2);if(ret < 0){printf("str1 小于 str2");}else if(ret > 0) {printf("str1 大于 str2");}else {printf("str1 等于 str2");}return(0);    //str1 大于 str2
}
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <pthread.h>
#include <unistd.h>#if 0
int main() {// int a;// char pNum[]="0x7f";// a=strtoul(pNum,0,16);// printf("%d\n",a);  //127 ,%x也是127 // return 0;char str[30] = "2030300 This is test";char *ptr;long ret;ret = strtoul(str, &ptr, 10);printf("数字(无符号长整数)是 %lu\n", ret);  // 2030300printf("字符串部分是 |%s|\n", ptr);  // This is testreturn 0;
}
#endif
char temp_log_0[100] = {0};
sprintf(temp_log_0, " '%d' ", a);
char temp_log_1[100] = "echo ";
strcat(temp_log_1, temp_log_0);
char temp_log_2[100] = " >> /var/log/a.log";
strcat(temp_log_1, temp_log_2);
system(temp_log_1);  // C
if(-1 == std::system(temp_log_1)){}; // CPP
if(-1 == std::system("echo 'aaa' >> /var/log/a.log")){};
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>void cp (char *path_from, char *path_to)
{FILE *fp_read = NULL;FILE *fp_write = NULL;char ch = !EOF;fp_read = fopen(path_from, "r"); ///// if (fp_read == NULL)// {//     printf("您没有这个(%s)文件\n", path_from);// }fp_write = fopen(path_to, "w"); while ((ch = fgetc(fp_read)) != EOF) // 读{fputc(ch,fp_write);   // 写}fclose(fp_read);fclose(fp_write);
}int main(void)
{char path_from[50];char path_to[50];printf("输入文件名:"); // D:\1.txtscanf("%s", path_from);printf("\n输入文件名:"); // D:\2.txt,不存在会自动创建scanf("%s", path_to);cp(path_from,path_to); return 0;
}
#include<stdio.h>
#include<assert.h>char* my_strcpy(char* dest, char* src)  //所以我这可以用两个char*类型了指针来接收
{assert(dest && src);//这个的意思就是避免dest和src是空指针,(如果有了这个assert(断言),就可以使当它们其中之一有空指针的时候就会报错,避免程序运行不报错,但要注意引头文件)char* ret = dest;//写这步的好处和原因有两个 1.可以使我的dest发生改变的时候还有一个指针指向它,使我便与寻找 2.可以使我的返回类型变得更加完美,完美实现char*的返回值的目的while (*src){*dest = *src;//这个的意思就是把源头的字符赋值给目的地dest++;//这两步一样就是使指针指向下一个字符,然后再循环src++;}*dest = *src;//这步的目的就是因为上面那个循环的条件是 src!='\0',所以当src为'\0'时,循环就会停止,导致*dest = *src这步在最后不能实现,所以'\0'就没有拷贝到dest中,所以我最后还要再进行一步赋值// while (*dest++ = *src++); // 这步的还是解引用后直接复制的意思,只是放在了循环之中(意思为当src为'\0'时,dest也为'\0',并且'\0'的ASCII码值为0,所以为假,所以此时循环依然停止), 这行可替代上面7行return ret;
}char* my_strncpy(char* dest, char* src, size_t num)  //比上面多了一个n
{assert(dest && src);//同理char* ret = dest;while (num){*dest = *src;  //复制src++;    //源地址往后+1dest++;num--; //我所需要拷贝的字符数随着我的循环一直减减}return ret;
}int main()
{char arr1[] = "abcdef";char arr2[20] = "bcd";my_strcpy(arr2, arr1);//因为数组就是首元素的地址,所以这边传上去的其实就是两个地址printf("%s",arr2);return 0;
}

5.结构体:存放一组不同数据类型的数据

在这里插入图片描述
如下最后一行*pst就是queen结构体变量。
在这里插入图片描述
结构体复制:基本类型用=,字符串用strcpy,结构体memcpy。
在这里插入图片描述
结构体作为函数的参数:结构体成员较多,函数参数的初始化和赋值的开销很大,最好的办法就是传递结构体变量的地址。
在这里插入图片描述

6.main函数的参数:main函数的参数是从命令提示符下执行程序时传入

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
int main(int argc, char **argv) {char *stty, *dev;dev = argv[1];stty = argv[2];printf("%s\n%s\n",dev,stty);
}

在这里插入图片描述

// a.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>extern int h_errno;
int main(int argc, char **argv)
{char   *ptr, **pptr;char    str[INET_ADDRSTRLEN];struct hostent *hptr;  //while (--argc> 0) {ptr = *++argv;  //传入的域名if ( (hptr = gethostbyname (ptr) ) == NULL)   //完成域名解析{printf("gethostbyname error for host: %s: %s",ptr, hstrerror (h_errno) );continue;}printf ("official hostname: %s\n", hptr->h_name);for (pptr=hptr->h_aliases; *pptr!= NULL; pptr++)printf ("\talias: %s\n", *pptr);switch (hptr->h_addrtype) {case AF_INET:pptr = hptr->h_addr_list;for ( ; *pptr != NULL; pptr++)printf ("\taddress: %s\n",inet_ntop (hptr->h_addrtype, *pptr, str, sizeof (str)));  //hptr->h_addrtype我们获取的IP地址break;default:printf("unknown address type");break;}}exit(0);
}$ gcc a.c -o a
$ ./a www.baidu.com
official hostname: www.a.shifen.comalias: www.baidu.comaddress: 180.101.50.188  (浏览器输入都会跳转到百度)address: 180.101.50.242

7.static/inline/回调/extern/堆内存:inline内联函数本身就是static(本文件私有)函数,inline函数在c中作用性不高,c中用习惯了宏定义

什么函数被定义成内联函数呢?1.经常被调用(如果不经常被调用,节省一点时间也没意义),2.函数体里代码少(如果函数体里代码多,执行时间远大于跳转时间)。
在这里插入图片描述
如下左边的你有一个私人厨师,你将50块钱和厨师电话作为参数传给老好人函数,老好人做了一些买菜挑菜等杂活后调用你的厨师进行做饭,老好人不仅为你服务还为其他人服务。
在这里插入图片描述
如下方框是一个c文件,右边的c文件可以调到左边的var变量,每一个c文件不管里面写什么都可以编成o文件,右边的o文件var地址留空。最后链接成二进制文件时,链接就是编译,所以和1(外链)和2(内链)相关。
在这里插入图片描述
extern表示引用外部的变量,从外面来的。
在这里插入图片描述

8.typedef:define仅仅是简单的字符串的替换,而typedef则给这个类型新起了一个名字

8.1 给已定义的变量类型起个别名:给struct __person起了个别名person_t

struct __person
{char    name[20];uint8_t age;
}
typedef __person person_t;
//以上两段代码也可合并为一段:
typedef struct __person
{...
}person_t;

8.2 定义函数指针类型:必须用typedef,方法就是在“定义函数指针变量”前加上typedef

int (*pFunc)(char *frame, int len);  //定义了一个函数指针变量pFunc,它可以指向这样的函数:返回值为int,形参为char*、int
int *(*pFunc[5])(int len);  //定义了5个函数指针变量:pFunc[0]、pFunc[1]···,它们都可以指向这样的函数:返回值为int*,形参为int//举例:
typedef  int (*pFunc_t)(char *frame, int len); //定义了一个类型pFunc_t 
int read_voltage(char *data, int len)
{int voltage = 0;return voltage;
}
int main(void)
{pFunc_t  pHandler = read_voltage;  //使用类型pFunc_t来定义函数指针变量
}

8.3 定义数组指针类型:先看如何定义数组指针变量

int(*pArr)[5]; //定义了一个数组指针变量pArr,pArr可以指向一个int[5]的一维数组
char(*pArr)[4][5]; //定义了一个数组指针变量pArr,pArr可以指向一个char[4][5]的二维数组//举例:
int(*pArr)[5]; //pArr是一个指向含5个int元素(因为最前面是int)的一维数组的指针变量
int a[5] = {1,2,3,4,5};
int b[6] = {1,2,3,4,5,6};pArr = &a; //完全合法,无警告
pArr = a; //发生编译警告,赋值时类型不匹配: a的类型为int(*) 相当于首地址,而pArr的类型为int(*)[5]
pArr = &a[0]; //发生编译警告,赋值时类型不匹配: a的类型为int(*),而pArr的类型为int(*)[5]pArr = &b; //发生编译警告,赋值时类型不匹配:&b的类型为int(*)[6],而pArr的类型为int(*)[5]
pArr = (int(*)[5])&b; //类型强制转换为int(*)[5],完全合法,无警告,但复杂,简化如下:typedef int(*pArr_t)[5];//定义一个指针类型,该类型的指针可以指向含5个int元素的一维数组
int main(void)
{int a[5] = {1,2,3,4,5};int b[6] = {1,2,3,4,5,6};pArr_t pA;//定义数组指针变量pApA= &a;//完全合法,无警告    pA= (pArr_t)&b;//类型强制转换为pArr_t,完全合法,无警告
}

8.4 定义数组类型:声明一个含5个int元素的一维数组:int a[5]

// 声明多个含5个int元素的一维数组:int a1[5], a2[5], a3[5]···,或者 a[N][5]   复杂,这时应该把数组定义为一个类型:
typedef int arr_t[5];
int main(void)
{arr_t d;  //d是个数组,这一行等价于:  int d[5];arr_t b1, b2, b3; //b1, b2, b3都是数组d[0] = 1;d[5] = 253; //编译警告:下标越界
}#define MaxNumbersOfName 10
#define MaxNumbersOfPhones 20
typedef char Elections_type[MaxNumbersOfNames]; // 10
Elections_type Phone[MAXNambersOfPhones]={"HUAWEI","XIAOMI","SAMSUNG","APPLE"}// char Phone[10][20]相同
typedef struct _jmp_buf
{ int _jb[_JBLEN + 1]; 
} jmp_buf[1]; 
// jmp_buf(定义变量实体的同时,也获得了该变量的地址)是一个含一个元素的数组类型,数组的元素为struct  _jmp_buf类型jmp_buf buf;      //这一行等价于:struct _jmp_buf buf[1]
buf->_jb[5] = 34; //这一行等价于:(&buf[0])->_jb[5] = 34
handle(buf);      //这一行等价于:handle(&buf[0])#define char* pchar;
typedef pchar_type char*;
// 只有p1,p2,p3被成功定义字符指针变量
pchar_type p1,p2;
pchar p3,p4;  // 在编译的时候就会被编译器看作char *p3,p4;造成了p4是一个char类型的变量

相关文章:

【c1】数据类型,运算符/循环,数组/指针,结构体,main参数,static/extern,typedef

文章目录 1.数据类型&#xff1a;编译器&#xff08;compiler&#xff09;与解释器&#xff08;interpreter&#xff09;&#xff0c;中文里的汉字和标点符号是两个字节&#xff0c;不能算一个字符&#xff08;单引号&#xff09;2.运算符/循环&#xff1a;sizeof/size_t3.数组…...

word图片水印

一、word中旧水印如何删除 打开word模板&#xff0c;想要删除旧水印&#xff0c;如下图所示操作&#xff0c;但是旧水印删除不掉。 以为上传新水印图片会替换掉旧水印&#xff0c;结果显示了2个水印&#xff0c;要怎么删除呢&#xff1f; 如下截图所示&#xff0c;双击打开页…...

kali安装及替换源

一、安装及简单配置 1.安装&#xff1a;地址就不贴了&#xff0c;自己打一下就好 2.虚拟机中打开kali 3.替换包源 (1)使用指令打开/etc/apt/sources.list mousepad /etc/apt/sources.list (2)将内容替换成阿里云源 deb http://mirrors.aliyun.com/kali kali-rolling main n…...

JSpdf,前端下载大量表格数据pdf文件,不创建dom

数据量太大使用dom》canvas》image》pdf.addimage方法弊端是canvas超出 浏览器承受像素会图片损害&#xff0c;只能将其切割转成小块的canvas,每一次调用html2canvas等待时间都很长累积时间更长&#xff0c;虽然最终可以做到抽取最小dom节点转canvas拼接数据&#xff0c;但是死…...

PHP关联数组[区别,组成,取值,遍历,函数]

关联数组 相较于数值数组&#xff0c;关联数组的索引可以为字符串和数字&#xff0c;关联数组元素也可称为键值对&#xff0c;索引为键&#xff0c;值为值。 源码 <?php echo "<hr>"; //水平线标签//关联数组$arr3 array(); //创建空的数组//关联数…...

JavaWeb--13Mybatis(2)

Mybatis&#xff08;2&#xff09; 1 Mybatis基础操作1.1 需求和准备工作1.2 删除员工日志输入参数占位符 1.3 新增员工1.4 修改员工信息1.5 查询员工1.5.1 根据ID查询数据封装 1.5.3 条件查询 2 XML配置文件规范3 MyBatis动态SQL3.1 什么是动态SQL3.2 动态SQL-if更新员工 3.3 …...

如何远程控制另一部手机:远程控制使用方法

在现今高科技的社会中&#xff0c;远程控制手机的需求在某些情境下变得越来越重要。不论是为了协助远在他乡的家人解决问题&#xff0c;还是为了确保孩子的在线安全&#xff0c;了解如何实现这一功能都是有益的。本文将为您简要介绍几种远程控制手机的方法及其使用要点。 KKVi…...

x64dbg中类似于*.exe+地址偏移

在CE和xdb中&#xff0c;形如*.exe数字偏移形式的地址被称为模块地址&#xff0c;CE附加到进程后点击查看内存&#xff0c;显示如下图 这种地址学名叫做模块地址&#xff0c;在x64dbg中显示如下图&#xff1a; CE中可以关闭&#xff0c;从而显示绝对的虚拟地址&#xff0c;如下…...

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1 1、 Dev.step(4)2、 Dev.step(-4) Dev.step(8)3、 Dev.turnLeft() Dev.step(4)4、 Dev.step(3) Dev.turnLeft() Dev.step(-1) Dev.step(4)5、 Dev.step(-1) Dev.step(3) Dev.step(-2) Dev.turnLeft() Dev.step(…...

Baidu Comate智能编码助手

Baidu Comate智能编码助手 &#x1f388;1.Baidu Comate的简介&#x1f388;2.安装Baidu Comate&#x1f388;3.Baidu Comate实现功能&#x1f388;4.使用注释进行智能代码提示&#x1f388;5.结束语 &#x1f388;1.Baidu Comate的简介 根据官网的介绍&#xff0c;我们了解到B…...

nginx自动部署-跨操作系统

项目里面有一个需求&#xff0c;就是需要用让nginx进程提供给系统管理一个start,stop和getPid方法&#xff0c;这样系统管理可以自动拉起来nginx&#xff0c;达到自动部署的目的。离线部署同样适用 这样一来&#xff0c;我就需要提供windows版本linux不同版本的nginx源码包&am…...

组合模式(结构型)

目录 一、前言 二、透明组合模式 三、安全组合模式 四、总结 一、前言 组合模式(Composite Pattern)是一种结构型设计模式&#xff0c;将对象组合成树形结构以表示“部分-整体”得层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式由以下角色组成…...

Pspice for TI学习

Pspice for TI中PSpice Part Search空白解决方法 配置环境变量 Cad_PSpice_TI_Regr_Srvr https://software-dl.ti.com/pspice/S009 重新安装2023版的Pspice Pspice安装链接 打开新安装的软件即可发现PSpice Part Search可以正常使用了 VSIN各参赛的含义 VOFF直流偏置VAMPL…...

LoRA的原理简介

在文章开始前先澄清一个概念&#xff0c;需要区分形近的单词"LoRa"&#xff08;long range&#xff09;&#xff0c;这是一项通信技术。熟悉物联网行业的朋友相对会比较熟悉LoRa这项技术&#xff0c;因为有些设备比如电梯的控制就使用了这个技术进行本地数据和命令的…...

安卓使用Fiddler抓包 2024

简介 最近试了一下安卓使用fiddler 抓包&#xff0c;发现https包基本都会丢失。原因是Anandroid 7版本针对ssl安全性做了加强&#xff0c;不认可用户的证书。我们要做的就是把fiddler导出的证书进过处理后放置到系统证书目录下面&#xff0c;这样才能抓包https请求。 这里使用…...

【前端每日基础】day2 const var const的区别

var: 在早期的 JavaScript 中&#xff0c;var 是声明变量的唯一方式。它有以下特点&#xff1a; var 声明的变量是函数作用域&#xff08;function-scoped&#xff09;&#xff0c;而不是块作用域&#xff08;block-scoped&#xff09;&#xff0c;这意味着它们在整个函数内部都…...

乡村振兴的文化旅游融合:整合乡村文化资源与旅游资源,发展文化旅游产业,提升美丽乡村的文化内涵和旅游吸引力

一、引言 随着城市化进程的加速和人们精神文化需求的日益增长&#xff0c;乡村旅游逐渐成为旅游市场的新热点。乡村振兴战略的提出&#xff0c;为乡村旅游的发展提供了新的契机。在这一背景下&#xff0c;如何整合乡村文化资源与旅游资源&#xff0c;发展文化旅游产业&#xf…...

力扣题目101:对称二叉树

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…...

struct和union大小计算规则

Union 一&#xff1a;联合类型的定义 联合也是一种特殊的自定义类型&#xff0c;这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间&#xff08;所以联合也叫共用体&#xff09; 比如&#xff1a;共用了 i 这个较大的空间 二&#xff1a; 联合的…...

数据库课程设计《基于Spring Boot + MyBatis + MySQL 实现Java医院药品管理系统》+源代码

文章目录 源代码下载地址项目介绍项目功能 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 库存管理 登记入库的药品。 登记出库的药品。 每日检查库存下限&#xff0c;报警。 每日检查过期的药品&#xff0c;报警并做退回销毁处理。 对有问题…...

【每日力扣】98. 验证二叉搜索树 与 108. 将有序数组转换为二叉搜索树

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 98. 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&a…...

Django3 个人开发笔记

查询函数 select_related 在 Django ORM 中&#xff0c;select_related 是一个查询性能优化工具&#xff0c;用于解决关联对象的查询效率问题。当你有两个通过外键&#xff08;ForeignKey&#xff09;或一对一字段&#xff08;OneToOneField&#xff09;连接的模型时&#xf…...

【全开源】Java U U跑腿同城跑腿小程序源码快递代取帮买帮送源码小程序+H 5+公众号跑腿系统

特色功能&#xff1a; 智能定位与路线规划&#xff1a;UU跑腿小程序能够利用定位技术&#xff0c;为用户提供附近的跑腿服务&#xff0c;并自动规划最佳路线&#xff0c;提高配送效率。订单管理&#xff1a;包括订单查询、订单状态更新、订单评价等功能&#xff0c;全行业覆盖…...

物联网实战--平台篇之(五)账户界面

目录 一、界面框架 二、首页(未登录) 三、验证码登录 四、密码登录 五、帐号注册 六、忘记密码 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/cat…...

9. Django Admin后台系统

9. Admin后台系统 Admin后台系统也称为网站后台管理系统, 主要对网站的信息进行管理, 如文字, 图片, 影音和其他日常使用的文件的发布, 更新, 删除等操作, 也包括功能信息的统计和管理, 如用户信息, 订单信息和访客信息等. 简单来说, 它是对网站数据库和文件进行快速操作和管…...

ELK+kafka日志采集

ElasticSeach&#xff08;存储日志信息&#xff09; Logstash&#xff08;搬运工&#xff09; Kibana 连接ElasticSeach图形化界面查询日志 ELK采集日志的原理&#xff1a; 在每个服务器上安装LogstashLogstash需要配置固定读取某个日志文件Logstash将日志文件格式化为json的…...

【C++ list所有函数举例如何使用】

C 中的 std::list 是一个双向链表&#xff0c;提供了在列表中添加、删除、访问元素等操作的方法。以下是一些常用的 std::list 函数以及如何使用它们的示例&#xff1a; push_back(const T& value): 在列表的末尾添加一个值为 value 的元素。 std::list<int> mylis…...

HTML5(1)

目录 一.HTML5(超文本&#xff08;链接&#xff09;标记&#xff08;标签<>&#xff09;语言) 1.开发环境&#xff08;写代码&#xff0c;看效果&#xff09; 2.vscode 使用 3.谷歌浏览器使用 4.标签语法 5.HTML基本骨架&#xff08;网页模板&#xff09; 6.标签的…...

【LAMMPS学习】八、基础知识(6.2)LAMMPS GitHub 教程

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…...

专业习惯:避开本地语言,使用通用语言

如果你的目标是走一步看一步&#xff0c;那躺平就得了&#xff0c;学习什么的都没有必要。如果你的目标是远方&#xff0c;那么就需要未雨绸缪。 在工作之中&#xff0c;本地语言及习惯固然可用&#xff0c;但非常局限&#xff0c;随便换一个地方和场景&#xff0c;别人就难以理…...

wordpress 游客留言/怎么自己开网站

前提条件&#xff1a; (1) zabbix服务器端已经成功安装并且运行。 (2) zabbix客户端已经成功建立并且运行。 1 下载并且安装msmtp软件 Wget http://sourceforge.net/projects/msmtp/files/msmtp/1.4.32/msmtp-1.4.32.tar.bz2/download tar jxvf msmtp-1.4.32.tar.bz2 cd ms…...

英山县住房和城乡建设局网站/浏览器下载安装2023版本

Liunx要查找某个文件&#xff0c;但不知道放在哪里&#xff0c;可以通过下面命令来查找&#xff1a;&#xff08;1&#xff09;which 查看可执行文件的位置&#xff08;2&#xff09;whereis 查看文件的位置&#xff08;3&#xff09;locate 配合数据库查看文件位置&#xff08…...

网站建设及数据分析/成都调查事务所

k个男生和k个女生站成一列&#xff0c;前面k个是男生&#xff0c;后面k个是女生&#xff0c;从第一个男生开始报数&#xff0c;报到队列最后一个同学&#xff0c;循环到队首继续报&#xff0c;并且如果一个同学报到的数是m&#xff0c;这个同学就出列&#xff0c;然后后面的同学…...

数据分析师工资/适合seo的建站系统

2019独角兽企业重金招聘Python工程师标准>>> 微信破解&#xff0c;解密&#xff1f;How To Decrypt WeChat EnMicroMsg.db Database? https://www.2cto.com/article/201507/414509.html 如何备份微信的聊天记录&#xff1f; https://www.zhihu.com/question/199242…...

网站开发公司属于什么行业/在线资源搜索引擎

版权声明&#xff1a;欢迎转载&#xff0c;请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/43447681 init 6 重启Linux。free -m查看内存大小&#xff0c;已M为单位。df -h查看硬盘情况&#xff0c;包括大小和分区。cat /proc/cpuinfo查看CPU信息。file…...

做淘宝客网站域名是别人的/杭州网站排名提升

第一&#xff1a;计算方法理论、算法是如何理解的&#xff0c;如下&#xff1a;VIN码各位数字的“对应值”&#xff1a;01234567890123456789ABCDEFGHJKLMNPRSTUVWXYZ12345678123457923456789VIN码从第1位到第17位的“加权值”&#xff1a;12345678910111213141516178765432109…...