目录
const int *p = &a;(等价于int const *p = &a)
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