目录
指针
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.结构体成员变量的访问:
作业:
定义形式:
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
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;
}
void a;
高精度
int *p;
double *p;
char *p;
低精度
void *p;
p保存内存地址
int *、double *、char * 转换为 void * 需要强制类型转换
void *转换为int *、double *、char *不需要强制类型转换
strcpy -> 拷贝字符串
memcpy -> 拷贝一段内存空间
参考如下:
#include
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;
}
指针函数:是函数,函数的返回值类型是指针类型
函数指针:是指针,指针指向了函数
局部变量的地址不能返回,因为局部变量会随函数作用域结束被回收,虽然能够获得返回的地址,但地址对应的空间已经被回收过了
将函数的返回值作为下一个函数的参数
参考如下:
#include
#include
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;
}
定义形式:
int (*Fun)(int a, int b) = NULL;
定义函数指针变量Fun,占8个字节空间,指向int返回值有2个int参数的函数
参考如下:
#include
#include
#define N jjiang
int 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;
}
定义形式:
char *str[5];
int Fun(char **ppstr, int len);
要传递指针变量的地址即二级指针
char *p = NULL;
int Fun(char **pp);
参考如下:
#include
void fun(char **p)
{
*p = "hello world!";
return;
}
int main(void)
{
char *p = NULL;
fun(&p);
printf("p = %s\n",p);
}
==================================================================================================================================================
struct 结构体名
{
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
..
};
数据类型 变量名;
数据类型 *指针变量名;
struct student s = {"zhangsan", 'm', 19, 100};
struct student stu = {
.name = "lisi",
.score = 90,
};
参考如下:
#include
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;
}
. :结构体变量类型访问成员变量使用 .
-> :结构体指针类型访问成员变量使用 ->
整体类型由成员变量类型决定
参考如下:
#include
#include
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
#include
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
#include
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;
}