#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
// 限时代码
// Student stu1 = {"dajun", "女", 111, 99};
// Student stu2 = {"mtt", "女", 666, 89};
// Student stu3 = {"cqq", "女", 333, 76};
// Student stu4 = {"zp", "男", 222, 66};
// Student stu5 = {"aa", "女", 555, 73};
// Student stu[5] = {stu1, stu2, stu3,stu4,stu5};
// for (int i = 0; i < 5; i++) {
// printfStudent(stu[i]);
// }
// printf("\n");
// sortStudentForNumber(stu, 5);
// for (int i = 0; i < 5; i++) {
// printfStudent(stu[i]);
// }
// 字节是内存中最小的存储单位
// 1个字节是8个二进制位
// 访问变量
// 1.直接访问 : 通过变量名直接访问
// 2.间接访问 : 通过变量的地址(内存编号)访问变量
// 指针变量 : 保存的是地址
// int *p = NULL;
// 声明指针变量的时候 * 没有特殊意义 只是告诉编译器 这是一个指针变量
// int表示这个指针变量所指向的内存区域是一个整型存储区域 也就是说 指针变量p指向的内存区域里面 储存的值是一个整型
int a = 5;
// 声明一个指针变量
int *p = NULL;
// 指针变量p 指向 a的存储区域(地址)
// &a 取出变量a的地址
p = &a;
// 打印地址的占位符 %p
printf("%p\n", p);
printf("%p\n", &a);
// * 取值符
// *p 表示指针变量p 所指向地址 里面 保存的值
printf("%d\n", a);
// 通过指针变量p 来打印
printf("%d\n", *p);
// 修改变量a的值
a = 3; // 直接访问
*p = 30; // 间接访问
printf("%d\n", *p);
// 打印指针变量占用字节数
// 指针变量 占用8个字节 不管你是什么数据类型,只跟操作系统有关系
printf("%lu\n",sizeof(p));
// 指针变量的赋值 相当于 指针的重指向
int b = 3;
p = &b;
printf("%d\n", *p);
int num1 = 50;
int num2 = 40;
int *p1 = &num1;
int *p2 = &num2;
p2 = p1;
*p2 = 100;
printf("%d\n",num1);
printf("%d\n",num2);
printf("%p\n",p1);
printf("%p\n",p2);
printf("%d\n",*p1);
printf("%d\n",*p2);
// 指针的运算
// 地址里面的值 可以加减乘除
// 地址运算 只有 加 减
// 地址 + 1 要看指针变量的数据类型
// 如果 int 类型 地址 + 1 相当于 加4个字节
// 如果 char 类型 地址 + 1 相当于 加1个字节
*p = 3;
printf("%p\n",p);
p++;
printf("%p\n",p);
int c = 3;
int d = 5;
p = &c;
// 系统在分配变量的内存时 不一定分配的是连续的
// 数组在分配内存时 肯定分配是连续的内存区域
printf("&a = %p\n", &c);
printf("&b = %p\n", &d);
printf("%d\n", *p);
p--; // 地址 - 4
printf("%d\n", *p);
// 需求是:通过指针编写一个函数 通过指针交换两个整型变量的值
a = 1;
b = 2;
// 参数的传递 是实参向形参进行的传递 是一个拷贝的过程 是一个值的传递 地址是不一样的
// 交换时本着一个原则 操作的变量的地址 应该是一致的
changeValue(&a, &b);
printf("a = %d b = %d\n",a, b);
// 指针与数组
int array[4] = {1, 3, 5, 7};
printf("%p\n",&array[0]);
printf("%p\n",array);
// 申明一个指针变量 指向数组(数组的首元素)
// 数组名字本身就是数组首元素的地址 不需要加取地址符了
p = array;
printf("*p = %d\n",*p);
printf("*(p + 1)= %d\n",*(p + 1));
printf("%d\n",p[2]);
// 取出数组中元素的方法
// array[下标]
// *(array + 下标)
// 利用指针变量p取出数组元素
// p[下标]
// *(p + 下标)
// 计算数组中元素的个数
// 数组中总的元素个数 / 数组中单个元素的字节数 = 数组元素个数
int count = sizeof(array) / sizeof(array[0]);
printf("count = %d\n",count);
// array 代表整个数组
// p代表指针变量
// 需求:通过指针变量p 能不能求出来元素个数 --- 不能
// 指针变量占8字节 只跟操作系统有关
// 通过指针变量不能求出数组元素的个数
count = sizeof(p) / sizeof(*p);
printf("count2 = %d\n",count);
// 数组当函数参数时 传递的不是整个数组
// 传递的时数组元素的首地址(就是传递了一个指针)
short arr[4] = {6 , 3 , 9 , 1};
int *p4 = arr;
printf("%d\n",*p4);
char *p3 = arr;
printf("%d\n",*p3);
// 指针与字符串
// 常量字符串 “iphone”
char str1[] = "iphone";
// 把常量区的常量字符串 拷贝一份 给到栈区
char str2[] = {'i', 'p', 'h', 'o', 'n', 'e'};
char *pp = str1;
// 1.利用指针 打印字符串
printf("%s\n",str1);
printf("%s\n", pp);
// 2.利用指针 打印字符 h
printf("%c\n",str1[2]);
printf("%c\n", pp[2]);
printf("%c\n", *(pp + 2));
printf("%c\n", *(str1 + 2));
// 3.把h 更改成 w
str1[2] = 'w';
printf("%c\n",str1[2]);
*(pp + 2) = 'l';
printf("%c\n", *(pp + 2));
// 4.通过指针可以计算字符串的长度
// 思路: 第0位 *(p + 0)
// 第1位 *(p + 1)
// 第3位 *( p + 3)
// *(p + i) = '\0'
int cc = 0;
while (*(pp + cc) != '\0') {
cc++;
}
printf("%d\n", cc);
// 输出全部字符串
char *strings[3] = { "iOS", "Android", "Win8"};
// 指针数组 数组中保存的都是同一个类型的数据 指针数组中保存的都是指针类型 保存的都是地址
printf("%s\n",strings[0]);
printf("%s\n", *strings);
printf("%s\n",*(strings + 1));
// strings[0] = "SOS";
// printf("%s\n",strings[0]);
printf("%c\n", *strings[1]);
return 0;
}
Student.h文件:
void changeValue(int *num1 ,int *num2);
Student.m文件:
void changeValue(int *num1 ,int *num2){
int c = *num1;
*num1 = *num2;
*num2 = c;
}