指针

1,指针是什么?什么是指针呢?
我的理解是,是一个专门用来读地址的工具,就像快递员一样,得到的是快递上的地址,他能凭借着地址找到收件人。不同的是,快递员不能随意交换收件人的地址,不能把A的物品送给B,B的给A,但是指针完全可以,将AB两个地址交换,让A的地址装B的东西,B的地址装A的东西。举个例子,现在A房间的门牌号是315,它里面住着张三;B房间的门牌号是415,住着李四。如果我去酒店前台查询,A里面住着张三,B里面住着李四;同时A1住着也是张三,B2住着的也是李四。房间A,B就是变量,A1,B2就是地址,张三李四就是数据。如果我要找张三,我不能直接去A房间,我要知道他的门牌号315,三楼十五间,我就是指针。因此,指针得到的就是地址就是门牌号,指针变量就是存放地址的变量。


2,指针的定义。
类型名 *指针变量名;
例:

int i=5;
int *p=&i;
printf("%d",*p);
return 0; 


运行结果:5
//p是指针变量名,*表示该变量的类型是指针变量,*p代表指针所指的对象。再次强调,指针里存放的是地址而不是变量的数。


3,作为函数参数时怎么用。
定义一个指针  void f(int *p); 调用的时候给它一个变量的地址。
(1)、交换两个变量的值

#include <stdio.h>
void swap(int *pa,int *pb);
int main(){
    int a=5;
    int b=6;
    swap(&a,*b);
    printf("a=%d,b=%d",a,b);
    return 0;
}
void(int *pa,int *pb)
{
    int i=*pa;
    *pa=*pb;
    *pb=i;
}


运行结果:a=6,b=5
(2)、返回多个值

#include<stdio.h>
void minmax(int a[],int len,int *max,int *min);
int main(void){
    int a[]={1,2,3,4,5,6,7,8,56,84,53,24,85,45,98,99,36,25};
    int min,max;
    minmax(a,sizeof(a)/sizeof(a[0]),&max,&min);
    printf("min=%d,max=%d,sizeof(a)/sizeof(a[0])=%d",min,max,sizeof(a)/sizeof(a[0]));
    return 0;
}

void minmax(int a[],int len,int *max,int *min){
    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];
    }
    }
}

 

运行结果:min=1,max=99,sizeof(a)/sizeof(a[0])=18


4,数组
数组变量是特殊的指针,所以
    int a[10];
    int *p=a;  //无需用&取地址
数组的单元 ——>变量需要用&取地址。
    a==&a[0]
数组是const的指针,不能赋值
int a[] <——> int *const a=
[]可以对数组也可以对指针做
*也可以对数组做      *a=25
p[0]=a[0]
所以对于数组参数,以下类型等价。
int sum(int *ar,int n);
int sum(int *  ,int n);
int sum(int ar[],int n);
int sum(int [],int n);

附加:C99
1.假如指针是const。
表示一旦得到了某个变量的地址,不能再指向其他变量,成为const。
    int * const q=&i;     //q 是const,i的地址给了q,q不能指向别人。
*q=25;    //是对的
q++       //是错误的

2.所指的是const
表示不能通过这个指针去修改那个变量(不能是这个变量成为const)
const int *p=&i;
*p=26   //是错误的
i=26;   //对的
p=&j    //对的


i可以变,p也可以变,不能通过p去赋值,不能通过p去修改

一般

#include<stdio.h>
int main(){
    int i=5;
    int *p=&i;
    *p=25;
    printf("%d,%d",*p,i);
    return 0;
}


运行结果:25,25
如果所指的是const就不可以用*p=25;
int i;
const int *p1=&i; //
int const *p2=&i; //
int *const p3=&i;
const前面有*表示指针不能被修改。
const后面有*表示所指的东西不能被修改。

3.const数组
const int a[]={1,2,3,4,5,6};
数组变量已经是const的指针,每个单元都是const int。
一般数组传入函数时,传的是地址,函数内部可以修改数组;但是可以用const保护数组。
int sum(const int a[],int length)

4.指针运算(char一字节,int四字节)


*(p+n)=an[n]
运算:
(1)给指针加减一个整数
递加递减
两指针相减  ————>不是地址差,而是 地址差/sizeof,表示两者中间能放几个这样类型的东西
(2)给一个指针加1表示要让指针指向下一个变量
    int a[10];
    int *p=a;
    *(p+1)  ——>a[1]
但是如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义

5.*p++
1.取出p所指的那个数据,完事之后顺便把p移到下一个位置去
2.++优先级高于*
3.常用于数组类的连续空间操作(遍历)

#include<stdio.h>
int main(void){
    char ac[]={0,1,2,3,4,5,6,7,8,9,-1};
    char *p=ac;
    char *p1=&ac[5];
    int i;
    for(i=0;i<sizeof(ac)/sizeof(ac[0]);i++){
        printf("%d\n",ac[i]);
    }
    for(p-ac;*p!=-1;p++){
        printf("%d\n",*p);
    }
    printf("p1-p=%d\n",p1-p);
    printf("p  =%p\n",p);
    printf("p+1=%p\n",p+1);
    printf("*(p+1)=%d\n",*(p+1));
    int ai[]={0,1,2,3,4,5,6,7,8,9,};
    int *q=ai;
    int *q1=&ai[6];
    printf("q  =%p\n",q);
    printf("q1 =%p\n",q1);
    printf("*(p+2)=%d\n",*(p+2));
    printf("q1-q=%d\n",q1-q);
    return 0;
}

6.指针比较
1.<,<=,==,>,>=,!=都可以对指针做
2.比较他们在内存中的地址
3.数组中的单元的地址肯定是线性递增的

7.转换

总可以把一个非const的值转换成const的

void f(const int *x);
int a=15;
f(&a); //ok
const int b=a;

f(&a);  // ok
b = a + 1;  //error!

老手(指针类型转换)

8.总结:指针能干什么
1.需要传入较大的数据时用作参数;
2.传入数组后对数组做操作;
3.函数返回不知一个结果;
4.需要用函数来修改不知一个变量;
5..动态申请的内存

 

初学者,热烈欢迎各位大佬指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值