应用1:打印出两个数总最大数的地址
int *max2(int *x,int *y){ //注意这里的形参是指针变量,main传过来的是地址;
printf("max x = %p\n",x);
printf("max y = %p\n",y);
return *x>*y ?x :y;
}
int main(int argc, const char * argv[]) {
//返回a 、b两个数中大数的地址
int a = 3,b = 4;
printf("a = %p\n",&a);
printf("b = %p\n",&b);
int *p =max2(&a,&b);
printf("p = %p\n",p);
return 0;
}
应用2.通过指针函数来实现当用户输入1-7这几个数时提示周一到周日;
#include <stdio.h>
#include <stdlib.h>
//3
char *getDay(int n){
//这是定义一个字符串指针数组
char *days[]={
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六",
"星期日",
};
return n<8&&n>0 ? days[n-1]:"输入错误!";
}
int main (){
printf(”%s”,getdays(4));
}
应用3:定义一个函数 函数参数为指针变量 求十个数中的最大值:
int getMax(int *p,int len){
//假设max是第一个元素
int max=*p;
for (int i=1; i<len; i++) {
//找出最大值
if (*(p+i)>max) {
//找到最大值后,把最大值赋值给max
max = *(p+i);
}
}
return max;
}
int main(int argc, const char * argv[]) {
int a[10]={123,45,22,111,34,56,888,11,45,109};
int m = getMax(a,10);
printf("m = %d\n",m);
return 0;
}
函数指针变量
存放函数的首地址的指针变量就是函数指针变量
函数指针变量的定义
返回值类型 (*变量名)(函数的参数);
函数的声明:
int sum(int a,int b);----> 函数指针 int (*p1)(int a,int b);
//定义了一个函数指针 p1
//p1可以存放 返回值是int类型,并且有两个形参,形参的类型还都是int类型的函数的地址
//函数指针的初始化
p1 = sum; //sum存的就是函数在内存中的首地址
函数指针的使用实例:
#include <stdio.h>
int sum(int x,int y){
return x+y;
}
int jian(int x,int y){
return x-y;
}
int cheng(int x,int y){
return x*y;
}
int chu(int x,int y){
return x/y;
}
int main(int argc, const char * argv[]) {
//函数指针的使用
//1、定义函数指针
int (*p)(int ,int );
//2、给函数指针初始化
p = sum; //p也指向了sum函数
switch (3) {
case 1:
p = sum;
break;
case 2:
p = jian;
break;
case 3:
p = cheng;
break;
case 4:
p = chu;
break;
default:
break;
}
//3、用函数指针间接的调用函数
// (*p)(23,45);
int s = p(23,45);
printf("%d\n",s);
return 0;
}
构造类型:
由一个或者多个已定义类型的元素用构造的方法,构造新的类型
构造类型:
数组 结构体
结构体:
由相同类型或者不同类型的数据用构造方法,构造的类型
结构体的定义
struct 结构体名{
成员列表;
}; //注意此处的分号不能省
结构体变量有定义有三种方法
1)先定义结构体,然后在定义结构体变量
struct Student{
//学生学号
int sno;
//学生姓名
char name[21];
//学生年龄
int age;
//学生成绩
float score;
};
//注意:
1)结构体定义完成以后,计算机并不会给结构体分配内存空间
2)会在定义结构体变量后,分配存储空间
//结构体变量定义格式:
struct 结构体名 结构体变量名;
struct Student stu1; //这句话表示定义一个Student结构体类型的变量,变量的名称是stu1;
//stu1因为是Student类型,stu1可以存放学生的学号、姓名、年龄、成绩
struct Student stu4,stu2,stu3; //定义多个结构体变量
2)定义结构体的同时,定义结构体变量
格式:
struct 结构体名{
}结构体变量1,结构体变量2....;
struct Student{
//学生学号
int sno;
//学生姓名
char name[21];
//学生年龄
int age;
//学生成绩
float score;
}stu5,stu6,stu7; //也是用Student结构体定义了三个结构体变量
//名称分别为 stu5,stu6,stu7
3)使用匿名结构体定义结构体变量
struct {
}结构体变量1,结构体变量2....;
struct {
char *color;
int lunzi;
int speed;
}car1,car2,car3;
实例讲解结构体变量中成员的访问方法:
nt main(int argc, const char * argv[]) {
//定义一个Car类型的结构体
struct Car{
char *pp;
int lunzi;
int speed;
};
//用结构体类型,定义结构体变量
struct Car car1;
/*
car1
pp "奥拓"
lunzi 4
speed 350
car2
pp "时风"
lunzi 3
speed 180
*/
//获取结构体变量中的成员
// 获取品牌 car1.pp
// 获取轮子 car1.lunzi
// 获取速度 car1.speed
//访问时风 car2.pp
return 0;
}
实例讲解结构体变量的初始化:
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
struct Student{
//学生学号
int sno;
//学生姓名
char name[21];
//学生年龄
int age;
//学生成绩
float score;
};
//先定义结构体变量,然后再初始化
struct Student stu1; //占用字节数?
//给结构体变变量初始化
stu1.sno = 38;
stu1.age = 18;
stu1.score = 59.99f;
char name1[21]="张三丰";
//name1 = "张无忌";
strcpy(stu1.name, "张三丰a");
printf("学号:%d\n年龄:%d\n分数:%.2f\n姓名:%s\n",stu1.sno,stu1.age,stu1.score,stu1.name);
//1、stu1.name 占用多个字节 21
printf("stu1.name %ld\n",sizeof(stu1.name));
//2、stu1.name 字符串长度是多少
//汉字的编码问题
// UTF-8 xcode中默认的中文的编码是utf-8格式
// 国际通用编码 一个汉字占用 3个字节
// GB2312 GBK 国标 一个汉字占用2个字节
printf("stu1.name 长度:%ld\n",strlen(stu1.name));
//stu1.name = "zbz"; //
//2、定义结构体变量的同时,进行初始化
//初始化值得顺序要和定义结构体的顺序一致
struct Student stu2={8,"凤姐",18,49.99f};
printf("\n\n学号:%d\n年龄:%d\n分数:%.2f\n姓名:%s\n",stu2.sno,stu2.age,stu2.score,stu2.name);
//3、定义结构体的同时,还可以指定元素的初始化
struct Student stu3={.name = "lady Gaga"};
return 0;
}
计算结构体变量占用存储空间大小
/计算结构体变量在内存中占用的字节数的方法
//1)先找对齐模数
// 对齐模数 是结构体中的基本数据类型中占用字节数最大的那个
// 4
//2)在计算结构体变量的中各个成员占用的字节和 |
|