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

写在前面:

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函数时,交换的不是地址值而是地址值所对应的变量。
  • void swap(int &a,int &b)

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

  • void swap(int *a,int *b)

    是C语言的写法

    • 指针应用场景:
    1. 函数返回多个值,某些值就只能通过指针返回。传入的参数实际上是需要保存带回结果的变量。(函数中通过改变指针对应的变量,然后用来在主函数中调用指针来寻找修改后的变量,以达到返回多个值的效果)例如:swap(int *a,int*b)
    2. 函数返回运算的状态,结果通过指针返回。(用-1或0表示出错)
  • #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);
  •  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值