day_04.指针

day_04 小白学c语言第四天

1.1指针定义

       指针:指针变量,内存会为指针变量开辟空间,存地址编号

       地址:内存以字节为单位进行管理,1个字节1个编号,内存开空间的时候首字节的地址编号。

       空间:存储数值的内存空间, 地址+数据类型确定一个空间。

        指向对象类型的数据类型* 指针名;//例 int *a; a才是指针变量,并不是*a,int *是为了说明这是指针类型

                指针指向谁的地址,就指向谁,并保存地址                      

                             例 int b =100;

                             int a = 50;

                             int *p;

                             p = &b;//printf("%d",*p);----这里就会输出b地址内存的值

                             p = &a;//printf("%d",*p);----直接给指针p 赋值a地址,*p又直接变为*(&a)=50

1.2操作空间

        指针本身的空间------指针名

        指针指向的空间------*指针名

        //指针定义时候的* ----  代表指针的标记

        //指针使用的时候* ----  代表  解地址

        int a = 30;

        int *p;        //  *xx  ---  指针标记

        p = &a;

        *p = 20;// *----解地址,*p ==*(&a)==a

1.3指针的空间大小

        计算空间大小要用到sizeof

        指针空间的大小和指向对象的数据类型无关,应为指针变量之村首地址。

                例: int *arr[4];// 存4个int*  ==16/32     看使用的是32位/64位

                        printf("%d  %d\n",sizeof(arr),sizeof(int* [4]));//打印均为16(使用32位)

1.4指针偏移

        指针可以指向一块连续的空间,通过指针偏移对空间进行读写操作。

        指针指向数组中的元素。

                例: int a[5] = {4,5,6,7,8};

                        int *p = a;//  p指向a的首地址a[0]  p=&a[0]

                        //p  ------&a[0]

                        //p+1 ----&a[1]

                        //p+2-----&a[2] 

                        printf("%p %p %p %p %p\n",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]);

                        //%p是用来输出地址的格式控制符。

                         printf("%p %p %p %p %p\n",*(p),*(p+1),*(p+2),*(p+3),*(p+4),*(p+5));

                         //这两个输出结果相同

        两个指针相减

                int a[5] = {40,50,60,7,20};

                int *p = a;//指针变量等于数组名,数组名代表数组的首地址(&a[0])

                int*q = &a[3];

                printf("%d\n",q-p);//结果为3   -------   指向数组里面的元素的指针相减  =  元素下标之差

        指针偏移用在指针指向一块连续的空间。

        

练习:

#include<string.h>

        int main()

{

  1.         char str1[30] = "hello world";
    1.         char str2[30] = {'\0'};   //定义一个指针,通过指针操作将str1里面的字符复制到str2里面
      1.         char *p;
        1.         p = str1;
          1.         // str2[0] = *(p+0);
            1.         // str2[1] = *(p+1);
              1.         int len = strlen(str1);
                1.         int i;
                  1.         for(i=0;i<len;i++)
                    1.         {
                      1.                 str2[i] = *(p+i);
                        1.         }
                          1.         printf("%s",str2);

        return 0; 

1.5++   --  操作

        练习:

        1、使用指针将str1里面的字符倒序存放到str2里面

        char str1[30] = "hello world";

        char str2[30] = {'\0'};

                        

                    char str1[30] = "hello world";
                    char str2[30]={'\0'};
                    char *p;
                    int i;
                    int len = strlen(str1);
                    p = &str1[len-1];
                    for(i=0;i<len;i=i+1)
                    {
                                str2[i] = *p;
                                p--;    
                    }
                    printf("%s",str2);

        2、输入一个字符串,输出这个字符串是不是回文字符串,如果是输出yes否则输出no

                    char str[30] = {'\0'};
                    printf("请输入一个字符串");
                    scanf("%s",&str[0]);
                    int len = strlen(str);
                    char *p;
                    char *q;
                    int flag = 0;//定义一个标识符 = 0
                    for(p=&str[0],q=&str[len-1];p<q;p++,q--)
                    //当p>q,说明已经过了一半 
                    {
                            if(*p!=*q)
                            {
                                   flag = 1;
                            }
                    } 
                    if(flag==0)
                    {
                            printf("yes");
                    }
                    else
                    {
                            printf("no");
                    }

   

                        

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码可以优化的更简洁一些。 具体做法是: 1. 使用 mapOptional.orElseThrow() 方法来替代 mapOptional.map().orElse(),这样可以统一处理异常,并且代码更加简洁。 2. 使用 OptionalInt 类型来替代 Object 类型,这样可以省去转换为 int 类型的步骤,并且使用 OptionalInt 类型可以避免空指针异常。 3. 使用常量来替代魔法数字,这样可以提高代码的可读性。 修改后的代码可能长这样: ``` final int READING_TASK_LIMIT = mapOptional.orElseThrow(() -> new BusinessRuntimeException(ErrorCodeConstant._3002552.getCode(), ErrorCodeConstant._3002552.getMessage())) .get("day_complete_task_max") .map(dayCompleteTaskMax -> Integer.parseInt(dayCompleteTaskMax.toString())) .orElseThrow(() -> new BusinessRuntimeException(ErrorCodeConstant._3002552.getCode(), ErrorCodeConstant._3002552.getMessage())); ``` 但是,这段代码还有一些问题,需要进一步改进。 1. 使用 Optional 类型时,避免使用 get() 方法。 2. 使用 Optional 类型时,避免使用 toString() 方法。 3. 使用 Optional 类型时,避免使用 parseInt() 方法。 修改后的代码可能长这样: ``` final int READING_TASK_LIMIT = mapOptional.orElseThrow(() -> new BusinessRuntimeException(ErrorCodeConstant._3002552.getCode(), ErrorCodeConstant._3002552.getMessage())) .get("day_complete_task_max") .map(dayCompleteTaskMax -> (int) dayCompleteTaskMax) .orElseThrow(() -> new BusinessRuntimeException(ErrorCodeConstant._3002552.getCode(), ErrorCodeConstant._3002552.get
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值