首页 > 其他分享 >指针进阶--指针与一维字符型数组

指针进阶--指针与一维字符型数组

时间:2024-08-09 23:27:52浏览次数:12  
标签:src const 进阶 -- char dest int 指针

目录

const关键字:

const int a  =10;

const int *p = &a;(等价于int const *p = &a)

const的应用:

一维字符型数组与字符函数

指针实现strcpy的功能:

指针实现strncpy的功能:

指针实现strcat功能:

指针实现strncat功能:

指针实现strcmp功能:

指针实现strncmp功能:

void*指针(万能指针):

指针实现memcpy:

strcpy与memcpy的区别:


const关键字:

const int a  =10;

修饰变量a,表明变量a的值,只能阅读,不能修改

const int *p = &a;(等价于int const *p = &a)

//此处const 限定的是基类型,表明不能通过*p的方式修改基类型数组。

int  * const p;//const限定的是指针变量p,表示将p限定为只读,p不能被修改(p++,p只读,不能作为左值)

const int *const p = &a;此时基类型和指针变量都被限定为只读。

const的应用:

就近原则:const 靠近谁,谁就是常量

1.如果不想通过*p方式修改基类型的对应的数据则const int*p = &a/int const *p=&a

2.指针变量定好后,不想再指定别的变量则:int * const p

字符串的访问与修改

char s[] = "hello";

此时字符串存储在栈区,可以任意访问与修改

const char *s = "hello";

此时s代表字符串的所在地址为字符串常量区;只能访问,使用但是不能修改


char *p = "hello";
*p = "H";//编译没问题,执行时报段错误,因为字符串存储在字符串常量区,不能修改

const char *p = "hello";
*p = "H";//编译时就报错,有const修饰,说明该指针所指向的内存空间不能被修改

所以尽量能写const的地方都写:const char  *p = "hello"(严谨写法,说明该字符串只读)

一维字符型数组与字符函数

指针实现strcpy的功能:
strcpy函数声明:char *Strcpy(char *dest,const char* src)
 char *Strcpy(char *dest,const char *src)
 {
     char *ret = dest;
     while(*src != '\0')
     {
         *dest = *src;
         dest++;
         src++;
     }
     return ret;
 }
指针实现strncpy的功能:
strncpy函数声明:char *strncpy(char *dest,const char *src,size_t n)
 char *Strncpy(char *dest,const char *src,size_t n)
 {
     char *ret = dest;
     while(*src != '\0'&& n != 0)                                                                                                     
     {
         *dest = *src;
         dest++;
         src++;
         n--;
     }
     while(n)
     {
         *dest = '\0';
         dest++;
         n--;
     }
     return ret;
 }
//如果n>strlen(src),拷贝完src后,继续往dest中拷贝n-strlen(src)个'\0',总拷贝次数要到达n
//如果n<strlen(src),拷贝完n次会自动加'\0';
指针实现strcat功能:
strcat函数声明:char *strcat(char *dest,const char *src)
  char *Strcat(char *dest,const char *src)
  {
      char *p = dest;
      while(*dest != '\0')                                                                                                             
      {
          dest++;
      }
      while(*src !='\0')
      {
          *dest = *src;
          dest++;
          src++;
      }
      *dest = '\0';
      return p;
  }
指针实现strncat功能:
strncat函数声明:char *strncat(char *dest,const char *src,size_t n)
char *strncat(char *dest,const char *src)
{
    char *p = dest;
    while(*dest != '\0')
    {
        dest++;
    }
    while(*src !='\0' && n)
    {
        *dest = *src;
        dest++;
        src++;
        n--;
    }
    *dest = '\0';
    return p;
}
//如果n<strlen(src),就拷贝src中的前n个字符到dest中,
//如果n>strlen(src),就直接把src拷贝过去
//确保拷贝过后是字符串,手动加'\0'
指针实现strcmp功能:
函数声明:int strcmp(const char *dest,const char *src)
  int Strcmp(const char *s1,const char*s2)
  {
      while(*s1 == *s2 && *s1!='\0' && *s2!='\0')
      {
          s1++;
          s2++;
      }                                                                                                                                
      return *s1-*s2;
  
  }
指针实现strncmp功能:
strncmp函数声明int strncmp(const char *dest,const char *src,size_t n)
 int Strncmp(const char *s1,const char*s2,size_t n)
 {
     while(*s1 == *s2 && *s1!='\0' && *s2!='\0' && n-1)
     {
         s1++;
         s2++;
         n--;
     }
     return *s1-*s2;
 }
void*指针(万能指针):

注意:如果用空类型的的指针进行间接运算,必须转换成有明确类型的指针才能运算(这样才能确定基类型有多大,开辟空间进行运算)

int a = 10;
int *q = &a;
void *p = q;//万能指针能接收任意指针类型,不用强转也不报错

printf("%d\n",*p)//警告dereferencing(解引用)空类型的(即无类型)不行,虽然sizeof(p) = 1;但还是认为它不存在,不知道是什么类型,*p运算取出地址,开辟空间,空类型怎么开辟?

printf("%d\n",*(int*)p);//强转后即可取值
int *r = q//万能指针能转化为任意类型的指针

//p本身是有字节的,有空间的,可以进行p++,但是我们认为没有,但又没有办法表现没有
指针实现memcpy:

不管是4字节还是8字节数据,都一个字节一个字节拷贝,所以能拷贝任何类型的数据

void *memcpy(void *dest,const void *src,size_t n)
{
    asser(dest != NULL && src != NULL)//assert断言,起判断作用
    char *p =(char*) dest;
    const char *q = (const char*)src;//void*类型可不强转,为了严谨进行强转
    while(n)
    {
        *p = *q;
        p++;
        q++;
        n--;
    }
    
}
strcpy与memcpy的区别:

1.复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如数组、字符串、整型、结构体等。

2.复制的方法不同:strcpy不需要指定长度,它是遇到字符串结束符'\0'而结束的。memcpy则是根据其第三个参数决定复制的长度

3.用途不同:通常在复制字符串时用strcpy,而若需要复制其它类型数据,则一般用memcpy

标签:src,const,进阶,--,char,dest,int,指针
From: https://blog.csdn.net/m0_73777617/article/details/140998857

相关文章

  • linux4
    增加虚拟内存的方法以及配置ddif=/dev/zoreof=/tmp/swapbs=4kcount=1000mkswap/tmp/swap重新增加400M的虚拟内存swapon/tmp/swap应用并激活我们重新划分的虚拟内存swapoff/tmp/swap关闭增加的虚拟内存raid磁盘整理常用的三种技术raid0raid1raid5对于redhatli......
  • MSPM0G3057学习记录(二)电机PID闭环控制
    目录一、PID原理讲解  1.比例增益(Proportional): 2.  积分时间(Integral): 3.  微分时间(Derivative):二、PID控制原理图三、位置式PID公式  四、参考代码(一)五、参考代码(二) 一、PID原理讲解          PID(Proportional-Integral-Derivative)闭环控......
  • linux3
    什么是逻辑卷管理器(lvm)?为了便于操作卷,包括重定义文件系统的大小,而定义的抽象层允许在多个物理设备上重新组织文件系统设置被认定为物理卷一个或多个物理卷可以用于创建成一个卷组卷组由固定大小的物理区域(pe)定义逻辑卷在卷组上创建,并且由PE组成文件系统创建在逻辑卷之......
  • 添加倒角和圆角容易导致装配体中几何关系丢失,需要怎么修改呢?进入报错的地方重新添加几
    问题描述:添加倒角和圆角容易导致装配体中几何关系丢失,需要怎么修改呢?进入报错的地方重新添加几何关系即可。问题解答:在SolidWorks中,当你对装配体中的零件添加倒角或圆角时,确实有可能导致原本的几何关系(如配合关系)丢失或报错。出现这种情况时,以下是处理的方法:1.检查报错信......
  • linux5
    linux密码恢复的步骤第一步:重新启动电脑进入启动引导界面,按键盘的上下键固定启动界面第二步:按键盘上的e键编辑启动信息,进入第二个启动界面第三步:用键盘的上下键选择第二个选项同时按e键编辑此选项第五步:按键盘上的b键重启我们的系统让修改生效第六步:进入单用户模式,passwd修......
  • 插入→面→移动面的作用是什么呢?是可以把一个面拉伸吗?
    问题描述:插入→面→移动面的作用是什么呢?是可以把一个面拉伸吗?问题解答:在SolidWorks中,“插入→面→移动面”工具的作用是修改现有零件的几何形状,它主要用来移动、拉伸、旋转或偏移指定的面。这个工具可以用于多种情况,包括调整零件尺寸、修改形状等。具体作用:移动面:你可......
  • Java进阶篇之super关键字
    引言在前面的文章中,我们介绍了继承的相关概念(Java进阶篇之继承的概念),在Java继承机制中,super关键字是一个重要的工具,用于访问父类的属性和方法,特别是在子类覆盖了父类的成员时。通过使用super,子类可以调用父类的构造方法,访问父类的成员变量和方法,这在继承层次中至关重要。本......
  • java 生成 二维码
    ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。导入对应的jar包<dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <v......
  • PEP 8 – Python 代码风格指南中文版(六)
    编程建议(1)我们应该以一种不会对其他Python实现(比如PyPy、Jython、IronPython、Cython、Psyco等)造成不利影响的方式来编写。例如,不要依赖CPython中对于a+=b或a=a+b形式的语句在原地字符串连接上的高效实现。这种优化即使在CPython中也是脆弱的(它仅对某些类型有效),并且......
  • 自定义类型:结构体
    文章目录结构体结构体定义和声明结构体的初始化和赋值对结构体类型名的优化结构体的自引用与嵌套结构体访问与操作匿名结构体结构体中的内存对齐(面试常考)计算结构体字节大小对齐规则为什么存在内存对齐?修改默认对齐数结构体传参结构体实现位段位段的内存分配位段跨平......