Autoleaders控制组——C语言指针学习笔记

一、指针基本概念理解

1. & 的含义

取地址的运算

2. 指针的定义

指针就是地址的编号,指针变量就是储存指针的变量。

3. * 的含义

  • 用 *访问该地址上的变量,可以做左值(写),也可以做右值(读)

  • *是定义指针变量的标志

            int i;
            int *p=&i;(*p为指针变量,p为地址)
    

4.总结

将地址(用&)传入函数后,可以在函数中更改该地址上的值(用*p)
(之前都是将值赋给新地址上的变量,没有改变原地址上的值)

二 、指针应用场景

1.交换两个变量的值

  void swap ( int *pa,int *pb)
  {
      int  t = *pa;
      *pa = *pb;
      *pb = t;
   }

交换了pa,pb地址上的值。

2.函数返回多个值,某些值只能通过指针返回

传入参数实际上是需要保存带回的结果的变量

#include<stdio.h>
void minmax(int a[], int len, int *max, int *min );

int main()
{
	int a[]={1,2,3,4,5,6,7,8,9,12,13,16,55,}; 
	int min,max;
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d\n",min,max);
	
	return 0;
}

void minmax(int a[],int len,int *min,int *max)
{
	int i;
	*min =*max=a[0];
	for(i=1;i<len;i++){
		if( a[i]<*min ){
			*min=a[i];
		}
		if( a[i]>*max){
			*max=a[i];
		}
	}
}

同时输出最大值与最小值

3.函数返回运算的状态,函数的结果由指针返回

套路:函数返回特殊值(不属于有效值的数)表示出错:例如 -1,0

#include<stdio.h>
int divide(int a,int b,int *result);

int main(void)
{
	int a=5;
	int b=2;
	int c;
	if(divide(a,b,&c)){
		printf("%d/%d=%d\n",a,b,c);
	}
	return 0;
 } 
 
 int divide(int a,int b,int *result)
 {
 	int ret = 1;
 	if(b==0) ret = 0;
 	else{
 		*result=a/b;
	 }
	 return ret;
 }

用无效值表示出错,只返回有效值

三、指针与数组

1. 传入函数的数组变成了什么?
函数参数表中的数组实际上是指针。

 sizeof (a) == sizeof(int*)

但是可以用数组的运算符 [ ] 进行运算。

2.数组参数

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

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

3.数组变量是特殊的指针

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

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

四、指针 与 const

1. 指针是const

表示一旦得到了某个变量的地址,不能再指向其他变量

 int *const q  = &i;     q是const
 *q=26;                 正确
 q++;                    错误

因为q指的是对应的那个地址,q 是const ,即q 的地址不能改变

2.所指是const

表示不能通过这个指针去修改那个变量 (并不能使得那个变量成为const)

const int *p = &i;
*p=26;      错误    (*p)是 const
i= 26;      正确
p=&j;       正确 

p上的变量值不能通过指针改变,但是p这个地址可以移动

五、指针计算

1,指针加减法
p+1 指针指向下一个单元

*p=0
*(p+n) = ac[ n ];
这里的值为一个数。

2.++ 与 - -
*p++ 先取出p所指的数,再将指针后移一位

3.两指针相减
地址相减=两指针相隔单元数

4.指针比较
即两地址大小比较

5. 0地址(NULL)不能读写,返回指针无效

6.不同类型指针不能相互赋值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值