C语言变量
结构体
1.结构体进行变量赋值时,数据输入需要使用取地址运算符
结构体指针变量,结构体数组
#include
struct student
{
char sname[10];
float score[3];
float sum;
}stu[3];
void main()
{
int i;
struct student *p = stu;
for (; p {
scanf("%s%f%f%f", p->sname, &p->score[0], &p->score[1], &p->score
[2]);
p->sum = p->score[0] + p->score[1] + p->score[2];
}
p = stu;
for (i &#61; 0; i <3; i&#43;&#43;)
{
printf("%s的总成绩:%5.2f\n", (*p).sname, (*p).sum);
p&#43;&#43;;
}
}
输出&#xff1a;
张三 80 60 80
李四 80 60 60
王二 80 80 90
张三的总成绩:220.00
李四的总成绩:200.00
王二的总成绩:250.00
请按任意键继续. . .
数组
int占用4字节&#xff0c;short占用2字节&#xff0c;double占用8字节&#xff0c;指针大小8字节
const int days[] &#61; { 31,28,30,30,32,35,36,32,32,32,31,30 };
printf("%d", sizeof days);//48,int是4个字节
printf("%d", sizeof days[0]);//4,days[0]中是一个元素的大小
printf("%d", sizeof days / sizeof days[0]);//12&#xff0c;获取数组大小
return 0;
数组作为参数时的表示方式&#xff0c;以下是等价的&#xff0c;都是传入数组的指针&#xff1a;
#include "stdafx.h"
#define SIZE 12
int sum(int *p, int n)
{
int i;
int total&#61;0;
for (i &#61; 0; i total &#43;&#61; p[i];
return total;
}
int main()
{
int days[SIZE] &#61; { 31,28,30,30,32,35,36,32,32,32,31,30 };
long answer;
answer &#61; sum(days, SIZE);
printf("total is %ld .\n", answer);
return 0;
}
指针
指针的加减
int main()
{
int urn[SIZE] &#61; { 100,200,300,400,500 };
int *ptr1, *ptr2, *ptr3;
ptr1 &#61; urn;
ptr2 &#61; &urn[2];
printf("ptr1&#61;%p,*ptr1&#61;%d,&ptr1&#61;%p\n", ptr1, *ptr1, &ptr1);
ptr3 &#61; ptr1 &#43; 4;
printf("ptr1&#43;4&#61;%p,*(ptr1&#43;4)&#61;%d\n", ptr1 &#43; 4, *(ptr1 &#43; 4));//指针移4个i
nt&#xff0c;一个int4字节&#xff0c;共移16字节
ptr1&#43;&#43;;
printf("ptr1&#61;%p,*ptr1&#61;%d,&ptr1&#61;%p\n",ptr1,*ptr1,&ptr1);//&#xff0c;ptr1中存放的
是*ptr1的地址值。&ptr1是指存放指针名称的地址&#xff0c;这里ptr1&#43;&#43;&#xff0c;地址移了4个字节&#xff0c;但是存放该
指针地址的%ptr1的值不变
ptr2--;
printf("ptr2&#61;%p,*ptr2&#61;%d,&ptr2&#61;%p\n", ptr2, *ptr2, &ptr2);//ptr2和ptr1
指向的值一样&#xff0c;地址值就一样&#xff0c;那么ptr1和ptr2存放的值就一样&#xff0c;但是存放ptr1和ptr2的地址的&
ptr1&#xff0c;&ptr2不一样
--ptr1;
&#43;&#43;ptr2;//恢复原来的指针位置
printf("ptr1&#61;%p,ptr2&#61;%p\n", ptr1, ptr2);
//指针的加减
printf("ptr2-ptr1&#61;%d\n", ptr2 - ptr1);
printf("ptr2-2&#61;%p\n", ptr2 - 2);
//ptr1&#61;00DFFCDC,ptr2&#61;00DFFCE4,ptr2 - ptr1 &#61; 2,E4-DC&#61;8个字节&#xff0c;int占用4个
字节&#xff0c;就是8/4&#61;2个位移
return 0;
}
在声明字符串变量时&#xff0c;如果要修改字符串变量&#xff0c;就不要用指针初始化&#xff0c;用数组初始化
//以下代码可以运行
char p1[] &#61; "KING";
p1[0] &#61; &#39;P&#39;;
printf(p1);
//以下不能运行
char *p1 &#61; "KING";
p1[0] &#61; &#39;P&#39;;
printf(p1);
回调函数
函数 F1 调用函数 F2 的时候&#xff0c;函数 F1 通过参数给 函数 F2 传递了另外一个函数 F3 的指针&#xff0c;在函
数 F2 执行的过程中&#xff0c;函数F2 调用了函数 F3&#xff0c;这个动作就叫做回调&#xff08;Callback&#xff09;&#xff0c;而先被当做指
针传入、后面又被回调的函数 F3 就是回调函数。
#include
#include // 包含Library Function所在读得Software library库的
头文件
int Callback() // Callback Function
{
// TODO
return 0;
}
int main() // Main program
{
// TODO
Library(Callback);
// TODO
return 0;
}
在回调中&#xff0c;主程序把回调函数像参数一样传入库函数。这样一来&#xff0c;只要我们改变传进库函数的参
数&#xff0c;就可以实现不同的功能&#xff0c;这样有没有觉得很灵活&#xff1f;并且丝毫不需要修改库函数的实现&#xff0c;这就是
解耦。