您的位置:首页 > 编程语言 > C语言/C++

C语言二刷第六天:指针(mooc视频;老师:翁恺)

2019-08-31 22:38 369 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_44788228/article/details/100169290

写在前面:

int *p;写成int*   p;会更好理解:定义的p是一个int*类型的指针。

有些编译器支持int*  p=(int*)a;强制转换(开发时不要这么写,仅限于理解方便)

*p表示被p指针指向的变量。

p表示地址值,和&a是同一种类型,可以进行赋值操作。

9.1.1

  • &获得变量的地址,它的操作数必须是变量。
  • 地址的大小是否与int相同取决于编译器(想要输出地址还是用%p,不能用%d)

         int i; printf(“%p”,&i);

  • &(i++),&(++i),&(a+b)不能取地址
  • 先定义的变量地址值高,自上而下存(堆内存)。
  • 数组名==&数组名
  • 9.1.2

  • &与*起相反作用,&取地址值,*取地址对应的变量值。
  • *是一个单目运算符,用来访问指针的值所表示的地址上的变量。

9.1.3

  • 指针注意事项:
  1. 指针作为函数的参数时,调用函数时传入的值为其地址值。
  2. 在交换swap函数时,交换的不是地址值而是地址值所对应的变量。
  • [code]void swap(int &a,int &b)

    是C++语言的写法,引用

  • [code]void swap(int *a,int *b)

    是C语言的写法

  • 指针应用场景:
  1. 函数返回多个值,某些值就只能通过指针返回。传入的参数实际上是需要保存带回结果的变量。(函数中通过改变指针对应的变量,然后用来在主函数中调用指针来寻找修改后的变量,以达到返回多个值的效果)例如:swap(int *a,int*b)
  2. 函数返回运算的状态,结果通过指针返回。(用-1或0表示出错)
  • [code]#include<stdio.h>
    int divide(int a,int b,int* result);
    void main(){
    int a=5;
    int b=2;
    int c;
    if(divide(a,b,&c)){
    printf("%d",c);
    }else{
    printf("除数不能为零!");
    }
    }
    int divide(int a,int b,int* result){
    if(b==0){
    return 0;
    }else{
    *result=a/b;
    return 1;
    }
    }

    以上程序好像指针在暗中把函数操作了一遍,返回值可以用来判断是否触发函数。

  • 9.1.4(数组参数)

    • 以下四种函数原型是等价的:

    int sum(int *ar,int n);

    int sum(int *,int);

    int sum(int ar[],int n);

    int sum(int [],int);

    • 数组变量是特殊的指针

    1.数组变量本身表达地址,所以:int a[10]; int* p=a;//无需用&取地址

    2.但数组单元表达的是变量,需要用&取地址:a==&a[0]

    3.[]运算符可以对数组做,也可以对指针做。:p[0]<==>a[0]

    4.数组变量是const常量指针,所以不能被赋值。:int a[] <==> int * const a=...(意思是:只要数组一经定义,其指针就已固定无法更改)

    所以两个数组之间不能做赋值:a[]=b[](error!)

    5.int *p=a[2]; 意思是p指向a数组的角标为2的元素。p[-1] 意思是基于刚才的2角标向前一个角标,即p[-1]==a[1]

    9.1.5

    • const int *p1 =&i;  int const * p2=&i;   这两种const在*前面表示,不能通过修改*p去赋值。*p=26(×)
    • int *const p3=&i; 表示p3指向 i 的事实不可被改变,p3不能指向别人了。p3可以通过*p3任意更改 i 的值(见:数组,指针的应用)
    • 保护数组值:int sum(const int a [], int length);(保证数组内每一个值都不可被改变,只能通过初始化完成赋值)

    9.2.1

    • int *p;  p+1:其意思是加上当前类型的一单位(例如:int加4个字节),在数组中即表示角标+1。
    • *p++:用于数组的角标操作(比如:遍历)

    9.2.2

    • 动态分配内存:适用于C99之前还不知道数组大小时,定义的动态数组。
    1. #include<stdlib.h>
    2. (void *) malloc(number*sizeof(数据类型));
    3. 比如:int n;     scanf("%d",&n);     int *a=(int*) malloc(n * sizeof(int));   (需要输入n个学生的成绩)free(a);
    •  
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: