目录
指针
1.const指针
2.void
3.函数指针和指针函数:
1.指针函数:
2.函数指针:
4.C语言中二级指针使用场景:
1.指针数组传参时:
2.函数体内想修改函数体外指针变量值的时
构造数据类型:
数据类型:
1.基本数据类型:
1, int
2,double
3,char
4,等等
2.构造数据类型:
1.struct 结构体
2.union 共用体
3.enum 枚举
1.结构体:
1.结构体类型的定义
2.结构体变量的定义
3.结构体变量的初始化:
1.全部初始化:
2.局部初始化:
4.结构体成员变量的访问:
作业:
指针
1.const指针
定义形式:
const 关键字 常量(只读) readonly
1.const int *p;
2.int const *p;
3.int *const p;
4.const int *const p;
5.int const *const p;
1和2是等价的
const修饰 *p,指针变量p的值可以改变,但不能利用指针修改指向空间中的值
3
const修饰 p,指针变量p的值不能改变,但可以利用指针变量p修改指向空间中的值
一定要对指针初始化
4和5是等价的
const修饰p和*p,指针变量p的值不能改变,也不能利用*p改变直系那个空间中的值
一定要初始化
参考如下:
#include<stdio.h>int main(void)
{const int *p = NULL;int const *q = NULL;int a = 300;int *const m = &a;const char *const n = "how";char const *const v = "are";p = &a;q = &a;printf("*P = %d *q = %d\n",*p,*q);printf("*m = %d\n",*m);*m = 200;printf("*P = %d *q = %d\n",*p,*q);printf("*m = %d\n",*m);return 0;
}
2.void
void a;
高精度
int *p;
double *p;
char *p;
低精度
void *p;
p保存内存地址
int *、double *、char * 转换为 void * 需要强制类型转换
void *转换为int *、double *、char *不需要强制类型转换
strcpy -> 拷贝字符串
memcpy -> 拷贝一段内存空间
参考如下:
#include<stdio.h>char *fun(void)
{char *str = {"hello world"};
// char str[32] = {"hello world"};return str;
}int main(void)
{char *p = NULL;p = fun();printf("p = %s\n",p);return 0;
}
3.函数指针和指针函数:
指针函数:是函数,函数的返回值类型是指针类型
函数指针:是指针,指针指向了函数
1.指针函数:
局部变量的地址不能返回,因为局部变量会随函数作用域结束被回收,虽然能够获得返回的地址,但地址对应的空间已经被回收过了
将函数的返回值作为下一个函数的参数
参考如下:
#include<stdio.h>
#include<string.h>char *fun(char *p,const char *q)
{char *o = p;while(*q != '\0'){*p = *q;p++;q++;}*p = '\0';return o;
}int main(void)
{char str1[32] = {0};char str2[32] = {0};fun(str2,fun(str1,"hello world"));printf("str1 = %s str2 = %s\n",str1,str2);strcpy(str2,strcpy(str1,"how are you"));printf("str1 = %s str2 = %s\n",str1,str2);return 0;
}
2.函数指针:
定义形式:
int (*Fun)(int a, int b) = NULL;
定义函数指针变量Fun,占8个字节空间,指向int返回值有2个int参数的函数
参考如下:
#include<stdio.h>
#include<stdlib.h>#define N jjiangint Inputa(int *pa,int len)
{int i = 0;for(i = 0;i < len;i++){scanf("%d",&pa[i]);}return 0;
}int Outputa(int *pa,int len)
{int i = 0;for(i = 0;i < len;i++){printf("%d ",pa[i]);}printf("\n");return 0;
}int Sorta(int *pa,int len,int (*pcmp)(int ,int ))
{int i = 0;int j = 0;int tmp = 0;for(j = 0;j < len -1;j++){for(i = 0;i < len - 1 - j;i++){if(pcmp(pa[i],pa[i+1])){tmp = pa[i];pa[i] = pa[i+1];pa[i+1] = tmp;}}}return 0;
}int sheng(int num1,int num2)
{if(num1 > num2){return 1;}return 0;
}int jiang(int num1,int num2)
{if(num2 > num1){return 1;}return 0;
}int jsheng(int num1,int num2)
{if(abs(num1) > abs(num2)){return 1;}return 0;
}int jjiang(int num1,int num2)
{if(abs(num2) > abs(num1)){return 1;}return 0;
}int main(void)
{int a[5] = {0};Inputa(a,5);Sorta(a,5,N);Outputa(a,5);return 0;
}
4.C语言中二级指针使用场景:
1.指针数组传参时:
定义形式:
char *str[5];
int Fun(char **ppstr, int len);
2.函数体内想修改函数体外指针变量值的时
要传递指针变量的地址即二级指针
char *p = NULL;
int Fun(char **pp);
参考如下:
#include<stdio.h>void fun(char **p)
{*p = "hello world!";return;
}int main(void)
{char *p = NULL;fun(&p);printf("p = %s\n",p);}
==================================================================================================================================================
构造数据类型:
数据类型:
1.基本数据类型:
1, int
2,double
3,char
4,等等
2.构造数据类型:
1.struct 结构体
2.union 共用体
3.enum 枚举
1.结构体:
1.结构体类型的定义
struct 结构体名
{
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
..
};
2.结构体变量的定义
数据类型 变量名;
数据类型 *指针变量名;
3.结构体变量的初始化:
1.全部初始化:
struct student s = {"zhangsan", 'm', 19, 100};
2.局部初始化:
struct student stu = {
.name = "lisi",
.score = 90,
};
参考如下:
#include<stdio.h>struct time
{int hour;int min;int sec;
};struct date
{int year;int mon;int day;
};struct datetime
{struct time t;struct date d;
};struct yusuan
{int jia;int jian;int cheng;int chu;
}ys;int main(void)
{struct yusuan ys = {1,2,3,4}; struct datetime dt = {{15,54,30},{2024,1,29}};struct date da = {.year = 2024,.mon = 1,};struct datetime *p = NULL;struct time ti = {16,33,10};p = &dt;printf("%d:%d:%d\n",ti.hour,ti.min,ti.sec);printf("%d-%d-%d-%d:%d:%d\n",dt.d.year,dt.d.mon,dt.d.day,dt.t.hour,dt.t.min,dt.t.sec);printf("%d----%d\n",p->d.year,p->t.hour);return 0;
}
4.结构体成员变量的访问:
. :结构体变量类型访问成员变量使用 .
-> :结构体指针类型访问成员变量使用 ->
整体类型由成员变量类型决定
参考如下:
#include<stdio.h>
#include<string.h>struct stduent
{char name[32];char sex;int age;int score;
};int main(void)
{struct stduent s;memset(&s,0,sizeof(s));gets(s.name);s.sex = getchar();scanf("%d%d",&s.age,&s.score);printf("姓名:%s\n性别:%c\n年龄:%d\n成绩:%d\n",s.name,s.sex,s.age,s.score);return 0;
}
作业:
1.定义一个结构体包含年-月-日三个成员
struct date
{
int year;
int mon;
int day;
};
从终端接收年月日信息存放到结构体中,计算该天为该年的第几天?计算该年剩余多少天?打印年月日信息
2.封装一个函数,给定一个数字字符串转换成其对应的整形数
"123456"
123456
int MyAtoi(char *pstr);
1,
#include<stdio.h>
#include<string.h>struct date
{int year;int mon;int day;
};int main(void)
{int panduan = 0;int sum = 0;int last = 0;int i = 0;int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};struct date d;memset(&d,0,sizeof(d));scanf("%d%d%d",&d.year,&d.mon,&d.day);if(d.year % 4 == 0 && d.year % 100 != 0 || d.year % 400 == 0){panduan = 1;}if(panduan == 1){a[2] = 29;}for(i = 0;i < d.mon;i++){sum += a[i];}sum += d.day;last = 356 - sum;if(panduan == 1){last = 366 - sum;}printf("%d-%d-%d为该年第%d天,该年还剩%d天\n",d.year,d.mon,d.day,sum,last);return 0;
}
2,
#include<stdio.h>
#include<string.h>int MyAtoi(char *pa)
{int sum = 0;int len = strlen(pa);while(*pa != '\0'){sum = sum * 10 + (*pa - 48);pa++;}return sum;
}int main(void)
{char a[64] = {0};int b = 0;gets(a);b = MyAtoi(a);printf("%d\n",b);return 0;
}