小小君的C语言第八课

#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;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值