小小君的C语言第八课

来源:互联网 发布:网络研修教学反思 编辑:程序博客网 时间:2024/05/21 17:22

#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
原创粉丝点击