08-指针

// 简单的指针

void fun1();

void fun1()

{

    // 创建一个空得指针

    // NULL很等于0

    int *p = NULL;

    // int *:指针类型

    

    // 指针所占字节大小只有操作系统有关,在64位操作系统下,指针占用8个字节,在32位操作系统下,指针占用4个字节

    unsigned long pointSize = sizeof(p);

    

    // 打印指针变量的值

    printf("%lu", pointSize);

}



// 取地运算符

void fun2();

void fun2()

{

    // 取址运算符

    int a = 3;

    int *p1 = &a;

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

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

}



// 取值运算符

void fun3();

void fun3()

{

    // 取值运算符

    int a1 = 3, b1 = 5;

    int *p2 = &a1;

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

    p2 = &b1;

    *p2 = 100;

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

    // *  & 是配套的操作符

}




// 指针的算数运算

void fun4();

void fun4()

{

    // 指针的算术运算

    int a = 10;

    int *p = &a;

    p++; // 向高位移动4个字节

    p--; // 向低位移动4个字节

    

    // 指针移动几个字节,取决于指针的类型

    

    // 指针的算数运算

    int *p2 = &a;

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

    p2++;    // 向高位地址移动四个字节

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

    p2--;    // 向低位地址移动四个字节

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

    // 打印出来的结果是不确定的,可能是

    // 移动多少位取决于你指针的类型,整形指针移动4个字节,float指针移动4个字节,double指针移动8个字节,char指针移动1个字节,short指针移动2个字节

    // 注意:指针的运算只有加减,没有乘除

}




// 指针的重指向

void fun5();

void fun5()

{

    // 指针的重指向

    int a4 = 4, b4 = 5;

    int *p4 = &a4;

    p4 = &b4;

    printf("%d", *p4);

    // 指针变量的赋值意味着重指向

    

    // 指针变量的重指向

    int num1 = 10, num2 = 20;

    int *point = &num1;

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

    point = &num2;

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

}




// 指针与数组

void fun6();

void fun6()

{

    // 指针与数组

    // 数组:用连续内存空间存储数据的构造类型

    // 数组名:数组元素首地址

    int array[3] = {1, 3, 8};

    // array <=> &array[0] // array的意思和&array[0]是相同的

    

    // 指针指向数组

    int *arrayPoint = array;

    // 此时arrayPoint  array 相同

    

    // 取出数组中的第一个元素

    int element1 = array[0];

    int element11 = *arrayPoint;

    printf("element = %d element11 = %d\n", element1, element11);

    

    

    // 指针可以当数组名使用,数组名也可以当指针来使用

    int *p = array;

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

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

    

    

    // 指针与数组的区别

    // 1. 指针的大小只取决于操作系统,与指针的类型无关。数组的大小与数组元素类型和数组元素个数有关

    // 2. 数组名是常量地址,不能重指向,指针可以重指向

    

    // 思考?

    // 使用指针能否计算出数组元素个数?

    // 答案:使用指针可以计算出字符串的长度,因为有结束标示‘\0’,不可以计算其它类型的数组长度,没有结束标示

 

    

    // 使用不同类型的指针指向数组,不会崩溃,但是得到的结果不是错误的

   
    short a[4] = {3 , 7 , 9 , 1};
    int    *p1 = a;
    char   *p2 = a;

}




// 指针与字符串

void fun7();

void fun7()

{

    // C语言使用字符数组保存字符串

   
    char string[10] = "iPhone";

    

    // string为数组名,同时也是数组的首地址。

    char *p = string;

   
   
 // 如何使用p输出字符串。

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

    

    

    // 字符指针可以操作单个字符,也可以操作字符串。

    char str[] = "Macbook Pro";

    char *str1 = "MacBook Air";

    

    // 字符数组中的字符可以修改

    str[0] = 'm';

    printf("str = %s\n", str);

    // 指针指向的字符串不可以修改,因为字符串处在常量去,但是指针可以重指向

    // str1[0] = 'm'; // 不可以修改

    str1 = "Mac Pro";

    printf("str1 = %s\n", str1);

}



// 练习1

void pratice1();

void pratice1()

{

    // 使用指针计算计算字符串的长度

    char string[] = "iPhone";

    char *p = string;

    

    int count = 0;

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

        count ++;

    }

    

    printf("字符串长度是:%d", count);

}



// 指针数组

void fun8();

void fun8()

{

    // 指针数组

    char *string[] = {"iOS""Android""WP8"};

    

    // 循环取值

    for (int i = 0; i < 3; i++) {

        printf("%s\n", string[i]);

    }

}




// 指针与函数

void change(int *a, int *b);

void change(int *a, int *b)

{

    int temp = *a;

    *a = *b;

    *b = temp;

}


void fun9();

void fun9()

{

    // 使用函数,交换两个实参的值

    int a = 10, b = 20;

    printf("交换前:a = %d  b = %d \n", a, b);

    change(&a, &b);

    printf("交换后:a = %d  b = %d \n", a, b);

    

}





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

{


    // 注意:*p :其中的‘*’是有两层意义的

    // 在定义指针变量的时候,‘*’的作用是告诉编译器,这就是一个指针

    // 在通过指针取值的时候,‘*’的作用是取值运算符,是访问内存地址为p的存储区域

    

    

    

    // '*'的不同作用:

    // 指针变量定义时: 只起修饰作用,告诉编译器p是指针

    // 指针变量取值时: 访问内存地址为p的存储区域

    

    

    // 简单总结

    // 指针变量是存放地址的变量,指针变量的赋值,意味着指针的重指向。

    // 数组名代表数组的首地址,而且是常量地址,不可以修改。

    // 函数调用时,形参拷贝了实参的值。

    

    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值