高级指针
#import <Foundation/Foundation.h>
//数组作为函数参数
//取一数组中的最大元素
void printMaxValueOfArray(int a[],int count);
void printMaxValueOfArray(int a[],int count)
{
int max = a[0];
for (int i = 0; i < count; i++) {
if (max < a[i]) {
max = a[i];
}
}printf("max = %d\n",max);
}
//打印数组
void printArray(int *arr, int count);
void printArray(int *arr, int count)
{
for (int i = 0; i < count; i++) {
printf("%d ",arr[i]);
}printf("\n");
}
//将数组元素大于27的清0;
void modifyArray(int *arr, int count, int limitNumber);
void modifyArray(int *arr, int count, int limitNumber)
{
for (int i = 0; i < count; i++) {
if (arr[i] >= limitNumber) {
arr[i] = 0;
}
}
}
//给定一个字符串,计算其中包含几个‘a',并将'a'转换成’A';
void test(char *str, int count);
void test(char *str, int count)
{
int number = 0;
while (*str != '\0') {
if (*str == 'a') {
number++;
*str = 'A';
}str++;
}printf("%d ",number);
}
//有5个学生,将成绩在90分以上的的标记为优,即姓名后面加(A);
typedef struct stu{
char name[40];
char sex;
int score;
}Student;
void markA(Student *stu, int count);
void markA(Student *stu, int count)
{
for (int i = 0; i < count; i++) {
if (stu[i].score >= 90) {
strcat(stu[i].name, "(A)");
}
}
}
void printStudent(Student *stu, int count);
void printStudent(Student *stu, int count)
{
for (int i = 0; i < count; i++) {
printf("%s %d\n",stu[i].name,stu[i].score);
}
}
//指针作为函数参数
void changeValue(int *number);
void changeValue(int *number)
{
*number = 100;
}
// 传值 和 传址
//定义一个交换两个整型变量的值的函数 定义形式:void swap(int x, int y);
void swap1(int x,int y);
void swap1(int x,int y){
int temp = x;
x = y;
y = temp;
}
//使用指针作为函数参数,可以实现在函数内部改变外部的值
void swap2(int *x,int *y);
void swap2(int *x,int *y){
int temp = *x;
*x = *y;
*y = temp;
}
//指针高级
/*
//结构体指针 指向结构体变量的的指针
typedef struct stu{
char name[20];
char sex;
int age;
}Student;
typedef struct stu2{
char *name; //代表字符串中的首地址
char sex;
int age;
}Student2;
*/
//宏 、条件编译、 枚举
#define MAXVALUE 100 //定义在主函数内部同样可以实现
#define kMax 10
typedef enum season{
spring,
summer,
autumn,
winter
}Season;
int main(int argc, const char * argv[])
{ /*
//数组作为参数 数组作为函数的参数,形参仅代表数组首元素地址,需要传入元素个数
int number[] = {10, 20 ,15, 35, 29, 3, 28,9, 100};
//取一数组中的最大元素
printMaxValueOfArray(number,sizeof(number)/sizeof(number[0]));
//打印数组中的元素
printArray(number, sizeof(number)/sizeof(number[0]));
//取一数组中的最大元素
modifyArray(number, sizeof(number)/sizeof(number[0]), 26);
printArray(number, sizeof(number)/sizeof(number[0]));
//给定一个字符串,计算其中包含几个‘a',并将'a'转换成’A';
char str[] = "hou are you,happy everyday";
test(str, sizeof(str)/sizeof(str[0])); //打印a的个数
printf("%s",str); //打印字符串
//有5个学生,将成绩在90分以上的的标记为优,即姓名后面加(A);
Student stus[5] = {
{"师父", 'm', 93},
{"悟空", 'm', 100},
{"八戒", 'm', 70},
{"沙僧", 'm', 60},
{"小白龙", 'm', 96}
};
printStudent(stus, 5);
markA(stus, 5);
printStudent(stus, 5);
*/
//指针作为函数参数
/*
//使用指针作为函数参数,可以实现在函数内部改变外部的值
int a = 0;
printf("%d\n",a);
changeValue(&a);
printf("%d\n",a);
int a = 10, b = 8;
printf("a=%d,b=%d\n",a,b);
swap1(a, b); //外部的值不能改变
printf("a=%d,b=%d\n",a,b);
printf("a=%d,b=%d\n",a,b);
swap2(&a, &b); //实现改变外部的值
printf("a=%d,b=%d\n",a,b);
int *p = &a;
//如果出现*的地方,前面的类型修饰符(例如int),此时*仅仅起到标志作用,告诉编译器,我是一个指针
*p = 20;
//如果出现*的地方,前面没有类型修饰符,此时*代表取值操作符,它会把指针指向的区域中的内容取出来,或赋值;
*/
//指针高级(结构体指针)
/*
//整型指针 指向整型变量的指针
int a = 10;
int *p = &a;
*p = 20;
//浮点型指针 指向浮点型变量的指针
float b = 1.5;
float *q = &b;
*q = 2.3;
//结构体指针 指向结构体变量的的指针
Student stu1 = {"zhangsan", 'm', 23};
Student *p = &stu1; //p存放结构体变量第一个成员的地址;
Student stu2 = {"loser", 'm', 23};
*p = stu2;
//如果p是结构体指针,那么*p就是整个结构体变量
//可以使用(*p).成员变量 来访问结构体成员
//也可以使用->来访问成员;
printf("%s %c %d",(*p).name,(*p).sex,(*p).age);
(*p).sex = 'f';
printf("%s %c %d",(*p).name,(*p).sex,(*p).age);
strcpy((*p).name, "loser"); //name 是字符串,不能直接改值 ,借助strcpy
printf("%s %c %d",(*p).name,(*p).sex,(*p).age);
p->age = 30; //访问成员
strcpy(p->name, "lisi");
int a = 10;
int *q = &a;
*q = 20;
//结构体数组与指针
Student stus[5] = {
{"zhangsan", 'm', 23},
{"lisi", 'f', 28},
{"wangwu", 'm', 23},
{"zhaoda", 'm', 13},
{"qianer", 'f', 33},
};
//数组名代表 数组的首地址 即:数组首元素地址
Student *p = &stus[3];
p->sex = 'f';
printf("%c %s",(*p).sex,p->name);
Student2 stu = {"zhangsan", 'm', 23};
Student2 *p = &stu;
p->sex = 'f';
strcpy(p->name, "lisi"); //不能改变常量的值,出错
printf("%s %c",p->name,p->sex);
*/
//宏 、条件编译、 枚举
//宏 命名规则
/*
#define ARRAYCOUNT 20 //纯大写定义宏 (宏不是变量)
#define kArrayCount 10 //驼峰命名法k+ //无参宏
#define kMaxValue(A,B) (A > B ? A : B) //带参的宏
#define kSum(C,D) (C + D)//宏只做替换,若没有括号,做优先级的检查
int a = MAXVALUE;
printf("%d \n",a);
int array[ARRAYCOUNT] = {0};
for (int i = 0; i < ARRAYCOUNT; i++) {
array[i] = arc4random() %20;
}
for (int i = 0; i < ARRAYCOUNT; i++) {
printf("%d ",array[i]);
}printf("\n");
int b = kMaxValue(3, 5);
//int b = (3 > 5 ? 3 : 5);
printf("%d \n",b);
int c = kSum(3, 5) * kSum(4, 6);
//int a = 3 + 5 * 4 + 6 //注意:宏只做替换,不做运算检查,不做优先级的检查
printf("%d\n",c);
//条件编译 按不同的条件,编译不同的代码
#ifdef kMax
int a = 20;
int b = a * 2;
printf("hello %d",b);
#else
int b = 5;
printf("no! %d",b);
#endif
//如果 标示符 被 #define过,编译器编译代码段1,否则2
//条件编译 在编译器进行,根据条件不同,编译不同的源代码
//if 是运行期 根据条件是否满足 执行相应的代码
int x = 10, y = 5;
if (x > y) {
printf("x > y");
}else {
printf("x < y");
}
#ifndef kMax
int a = 20;
int b = a * 2;
printf("hello %d",b);
#else
int b = 5;
printf("no! %d",b);
#endif
#if kMax
int a = 20;
int b = a * 2;
printf("hello %d",b);
#else
int b = 5;
printf("no! %d",b);
#endif
//枚举类型
Season s1 = autumn;
switch (s1) {
case spring:
printf("qu jiao you");
break;
case summer:
printf("qu you yong");
break;
case autumn:
printf("qu pa shan");
break;
case winter:
printf("qu hua xue");
break;
default:
break;
}
*/
return 0;
}