C语言回顾 九 高级指针

高级指针
#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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值