【嵌入式学习】c基础12.20---指针

1.相关练习

1>实现字符串逆置          

#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[]="hello";
char *start=str;
char *end=str+strlen(str)-1;
while (start<end)
{
char n=*start;
    *start=*end;
    *end=n;
    start++;
    end--;
}
     printf("%s",str);
}                                                                       

总结:通过设定start和end指向字符串的首和尾,将两者指向地址的值进行替换,再做自增和自减运算,当两者交叉停止 循环,输出最后的结果,从而实现字符串的逆置。

2>数组和地址引用关系

#include<stdio.h>
int main(int argc, const char *argv[])
{
    int arr[]={11,22,33,44};
    int *p=arr;
    for(int i=0;i<4;i++)
    {
        printf("%p\n",&arr[i]);
        printf("%p\n",&arr[0]+i);
        printf("%p\n",arr+i);    
        printf("%p\n",&p[i]);
        printf("%p\n",&p[0]+i);
        printf("%p\n",p+i);
//        printf("%p\n",p++);    
   }  
    return 0;
}

总结:首先p++语句会改变p的值,所以执行时要与其他语句隔离开,综上述语句可以看出地址和数组的等价引用关系:

地址:&arr[i] --->&arr[0]+i--->arr+i--->p+i--->&p[0]+i--->p++

值:arr[i]--->p[i]--->*(&arr[0]+i)--->*(arr+i) --->*(&p[0]+i)--->*(p+i)--->*p++

3> 定义有参无返函数实现输入

void input(int* p ,int n)
{
    for(int i=0;i<n;i++)
    {
        printf("please enter %d element:",i+1);
        scanf("%d",p+i);
    }
}

4>指针函数

 本质上是一个函数,返回一个地址

ps:写指针函数时,不可以返回局部变量的地址

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int* fun()
{
    int a=100,b=200;
    int arr[2];
        arr[0]=a,arr[1]=b;
    return arr;
}//arr是fun函数的局部变量,调用fun函数计算机申请内存,函数调用结束释放内存

因此需要将局部变量延长生命周期,或者使用其他方法 ,例如:返回堆区的内存地址malloc free

int* fun3()
{
    int a=3,b=4;
    int *p=malloc(8);
    *p=a,*(p+1)=b;
    return p;
}

总结:将局部变量在堆区申请内存,申请成功返回首地址,从而可以进行返回调用。

5>通用类型指针

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
    int a=100;
    void *p=&a;
    printf("*p=%d\n",*(int*)p);

    
    return 0;
}

总结:通用类型指针void *p,虽然可以转换成任意类型,但是使用的时候需要进行类型转换,同时要注意在转换()时,需要注意*要在()前。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值