我的IOS学习历程 - 第八天

#import <Foundation/Foundation.h>

#import "Function.h"

今天主要讲的指针的运用


void Myswitch(int *a, int *b){

    int temp = *a;

    *a = *b;

    *b = temp;

}



#import "Function.h"


int main(int argc, const char * argv[]) {


      字节是内存当中最小的存储单位

      一个字节是八个二进制位

    

      访问变量

      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",&a);

    

    // * 取值符

    // *p 表示指针变量p所指向的地址 里面 保存的值

    printf("%d\n",a);

    //  通过指针变量*p来打印

   printf("%d\n",a);

    

    //  修改变量a的值

    a = 3;//  直接访问

    *p = 30//  间接访问


    

    //  打印指针变量占用的字节数

    //  指针变量 占用8个字节 不管什么数据类型 只跟操作系统有关系

    printf("%lu",sizeof(p));

 

    //  指针变量的赋值相当于 指针变量的重指向

    

      指针的运算

      地址里面的值可以加减乘除

      地址运算 只有加 

      地址加1  要看这个指针变量的数据类型

      如果是int类型 +1 相当于  4个字节

      如果char类型  +1 相当于  1个字节(什么类型就加多少)

    int a = 3;

    int *p = &a;

    printf("%p\n",p);

    p++;

    printf("%p\n",p);

    

    int a = 4;

    int b = 5;

    int *p = &a;

    //  系统在分配内存时 不一定分配的是连续的

    //  数组在分配内存的时候 肯定是分配的连续的内存区域

    printf("&a = %p\n",&a);

    printf("&b = %p\n",&b);

    p--;//  相当于地址减4

    printf("%d\n",*p);

    

    

      需求: 编写一个函数 通过指针交换两个整形变量的值

    

    int a = 3;

    int b = 5;

   Myswitch(&a, &b);

    //  参数的传递 是实参向形参进行的传递 是一个拷贝的过程 是一个值的传递 地址是不一样的

    //  交换时本着一个原则 操作的变量的地址 应该是一致的

    

    printf("%d,%d",a,b);

    

      指针与数组

    int array[4] = {1, 3, 5, 7};

    printf("%p\n",&array[0]);

    printf("%p\n",array);

      声明一个指针变量 指向数组(数组的首元素)

      数组的名字本身就是数组的首元素的地址 不需要加取地址符

    int *p = array;

    printf("*p = %d\n",*p);

    printf("*(p + 1) = %d\n",*(p + 1));

    printf("%d\n",array[2]);

    printf("%d\n",*(p + 2));

    printf("%d\n",p[2]);

    printf("%d\n",*(array + 2));

      取出数组中的元素方法

      array[下标]

      *(array + 下标)

      利用指针变量p取出数组元素

      p[下标]

      *(p + 下标)

    

      需求:计算数组中的元素个数

      数组中总得元素占的字节数 / 数组中单个元素的字节数 = 数组元素个数

    int count = sizeof(array) / sizeof(array[0]);

      array  代表的是整个数组

      p 代表是指针变量

    printf("%d \n",count);

      通过指针变量p 不能求出数组元素个数

      指针变量只占8字节 只跟操作系统有关

    

      数组当函数参数时 传递的不是整个数组

      传递的是数组元素的首地址 指针

      函数的声明中 如果数组传入的时候就是传入的首地址 所以也需要输入元素个数来定义

    

    short a[4] = {3, 7, 5, 1};//  按字节数来计算

    int *p1 = a;

    short *p2 = a;

    printf("%d\n",*p1);

    printf("%d",*p2);

    

      指针与字符串

    char str1[] = "iphone";

//    char str2[] = {'i', 'p', 'h', 'o', 'n', 'e'};

    char *p = str1;

    //  1.利用指针打印字符串

    printf("%s\n",p);

    //  2.利用指针打印 h

    printf("%c\n",*(p + 2));

    //  3.h更改成w

    p[2] = 'w';

    printf("%c\n",*(p + 2));

      4.通过指针来计算字符串的长度

    int n = 0;

    while (p[n] != '\0') {

        n++;

    }

    printf("%d\n",n);

    char str[] = "wanglong";

    //  声明个指针 指向字符串sr

    char *p = str;

    //  思路: 第一位 *(p + 0)

    //       第二位 *(p + 1)

    //  * (p + i) == '\0'结束

    int count = 0;

    while (*(p + count) != '\0') {

        count++;

    }

    printf("%d \n",count);

    

    p[4] = 'x';

    printf("%s",p);

    

    char str[] = "iphone" ;//  这样直接写的话"iPhone"是常量字符串

      但是可以更改 因为iphone 存在于常量区 str[]是存在与栈区

      相当于将常量区的常量字符串 拷贝一份到栈区

    

    char *strings[3] = {"Ios", "Android", "WinPhone"};

    //  这里的字符串都是常量字符串 想更改的话必须先声明一个字符串将其拷贝到栈区

//    char str1[] = "Ios";//  这样的操作后就可以更改

    //  指针数组中保存的都是同一类型的数据

    //  输出所有字符串

    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[0][1]);


   

    //  如果你声明时 直接声明常量字符串 那么你是不能更改的 如果你声明时先声明一个字符串(这时这个字符串 是从常量区拷贝到栈区的字符串)

    

    /*

     指针变量是存放地址的变量,指针变量的

     赋值,意味着指针的重指向。

     数组名代表数组的⾸地址,⽽且是常量地

     址,不可以修改。

     函数调⽤时,形参拷⻉了实参的值。

     */

    return 0;

}

posted on 2015-10-19 19:02  彩虹直至黑白  阅读(95)  评论(0)    收藏  举报

导航