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

目录

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

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值