#import <Foundation/Foundation.h>
#import "Function.h"
//void printTwoArray(int (*array)[3],int row);
//void printTwoArray(int (*array)[3],int row){
// for (int i = 0; i < row; i++) {
// for (int j = 0; j < 3; j++) {
// printf("%d\t",*(*(array + i) + j));
// }
// printf("\n");
// }
//}
// 数组使用指针的形式当做函数参数
// 以下两种写法完全等价,实质上都是传入的数组的首地址
//void printArray(int *array[],int count){
// for (int i = 0; i < count; i++) {
// printf("%d\t",*(array + i));
// }
// }
//int changeString(char *str){
// int i = 0;
// int count = 0;
// while (*(str + i) != '\0') {
// if (*(str + i) == 'a') {
// count ++;
// *(str + i) = 'A';
// }
// i ++;
// }
// printf("%d个a\n",count);
// return count;
//}
//typedef struct Student{
// char name[20];
// char sex;
// int age;
// float score;
//}STUDENT;
结构体类型的数组当做函数参数
//void changeStudentAge(STUDENT *stus){
// stus -> age = 18;
//}
//
//void checkStudentsAge(STUDENT *stus , int count){
// for (int i = 0; i < count; i++) {
// if ((*(stus + i)) . age < 18) {
// changeStudentAge(stus + i);
// }
// printf("%s,%d\n",(stus+ i)->name,(stus + i)->age);
// }
//}
int main(int argc, const char * argv[]) {
///利用指针变相的实现一次函数调用拿到多个结果
//先准备好两个存放最大值和最小值的变量
//把两个变量的地址传过去,函数里面通过地址给两个变量赋值
// void swap(int * a, int *b);
//STUDENT stu = {"zhangsan", 'M', 25, 86.7};//在栈区存储
//定义一个结构体类型的指针指向一个结构体变量的首地址
//*p 取出的是整个结构体变量,使用.访问成员
//printf("%lu", sizeof(stu));
// STUDENT * p = &stu;
// //(*p).sex = 'f';
// //strcpy((*p).name, "lisi");//数组名是常量地址,不能进行修改重新赋值,要用strcpy(),进行修改
//使用指向结构体变量的指针 加上->(指向)操作符,访问结构体的成员
// strcpy(p->name, "lisi");
// p->age = 23;
// p->sex = 'F';
// printf("%s, %c, %d, %f", p->name, p->sex, p->age, p->score);
// printf("%s, %c, %d, %f", (*p).name, (*p).sex, (*p).age, (*p).score);
// STUDENT stu = {"zhangsan", 'M', 25, 86.7};
// STUDENT * p = &stu;
p->name得到的是一个指针,可以直接重新指向
// p->name = "lisi";
// printf("%s", p->name);
STUDENT stu1 = stu;
// STUDENT * p = &stu;
// STUDENT * p1 = &stu1;
// strcpy(p->name, "lisi");
// printf("%s, %s", p->name, p1->name);
// char name[20] = "zhangsan";
// STUDENT stu = {name, 'M', 25, 86.7};
// STUDENT stu1 = stu;
// STUDENT * p = &stu;
// STUDENT * p1 = &stu1;
// strcpy(name, "lisi");
// printf("%s, %s", p->name, p->name);
// STUDENT stus[3] = {
// {"zhangsan", 'M', 25, 98.2},
// {"lisi", 'F', 21, 85.7},
// {"wangwu", 'M', 18, 93.6},
// };
// STUDENT * p = stus;//数组名本身就是地址
printf("%s\n", (*p).name);
printf("%s\n", (*(p + 1)).name);//加的是32个字节
printf("%s\n", p->name);
printf("%s\n", (p + 1)->name);
使用结构体指针把数组中学生成绩大于90的姓名后面拼上(A)
// for(int i = 0; i < sizeof(stus) / sizeof(STUDENT); i++){//总的除以单个得到的是就是数组元素的个数
// if((p + i)->score >= 90){
// strcat((p + i)->name, "(A)");//strcat()字符串拼接函数,不是字符拼接函数,如果要拼接A, 应该拼接为"A"
// }
// }
// for(int i = 0; i < sizeof(stus) / sizeof(STUDENT); i++){
// printf("%s %.2f\n", (*(p + i)).name, (*(p + i)).score);
// }
// int x = 10, y = 15;
// swap(&x, &y);
// printf("x = %d y = %d", x , y);
// int a = 2;
// int b = 3;
// int c = 4;
// return max;
// //int result = max(2, 3, 4);
// printf("max = %d", result);
// int max = 0;
// int min = 0;
// maxValue(10, 15, 12, &max, &min);
// printf("max = %d, min = %d", max, min);
// 计算字符串中所有的小写字母a的个数,并把小写a改成大写A
// char string[] = "afhdjkahhfahjkaghakjhkjhgahahag";
// changeString(string);
// printf("改变字母之后的数组为%s",string);
//
//
// STUDENT stus[3] = {
// {"zhangsan", 'M', 16, 98.2},
// {"lisi", 'F', 21, 85.7},
// {"wangwu", 'M', 18, 93.6},
// };
// checkStudentsAge(stus , 3);
// changeStudentAge(stus);
//整形的指针数组
// 数组里面每个元素都是地址,数组总共占24个字节内存。每个指针占用8个内存空间
// int a = 5;int b = 6;int c = 3;
// int *p[3] = {&a,&b,&c};
// printf("%d\n",*(*(p + 1)));//*(p+i)取出的为地址
// for (int i = 0; i < 3; i++) {
// printf("%p ",*(p + i));
// }
// for (int i = 0; i < 3; i++) {
// printf("%d ",*(*(p+i)));
// }
// char strings[3][10] = {"iphone","Android","winPhone"};//在栈区开辟一个30个字符的内存空间
// strings[0] = "Apple";错误
// strcpy(strings[0], "apple");
// char * strings[3] = {"iphone","Android","winPhone"};//字符型指针数组,存储3个常量区字符串的地址。
可以直接重指向
// strings[0] = "Apple";
// for (int i = 0; i< 3; i++) {
// printf("%s ",*(strings+i));
// }
// int a = 5;
// int *p = &a;
// int ** p1 = &p;//指向指针的指针
// printf("%d",*(*p1));
// int array[2][3] = {{1,6,8},{2,7,5}};
// int (*p)[3] = array;//指向由三个元素组成的一维数组的指针
// printf("%d",*(*(p + 1) + 1));//*(p + 1)取出的是大数组中的下标为1的一个一维数组中的首地址,即为2,*(*(p + 1)+1)取出的是下标为1的一维数组中的首地址向后移动4个字节之后的地址,即为7
// 二维数组的第二维度必须要写
// 定义一个指向二维数组的指针
// int array[2][3] = {{1,2,3},{4,5,6}};
// printTwoArray(array,2);
return 0;
}