(一)指针 操作 一维字符型数组
-
const 关键字(只读)
eg:
(1)int *p; //基类型(目标类型)
(2)int a = 10;
①const int *p = &a; //const限定是基类型,表示不能通过 *p 的方式修改基类型的数据
②int const *p = &a; //与①等价
③int * const p = &a; //const限定的是指针变量p,此时表示将 p 限定为只读,不能修改p
④const int * const p = &a; //基类型和指针变量 p 都被限定为只读
原则:(就近原则)const 离谁近,就限定谁
-
应用
- 如果不想通过 *p 的方式改变基类型对应的数据: const int *p = &a; 或 int const *p = &a;
- 如果指针 p 定义好后,不想再指向别的变量: int * const p = &a;
注意:
形参 设计为 const char * :
(1)目的:防止函数中的误操作。
(2)好处:①提前发现问题,将运行时问题提前到编译时;②提高代码的适应性 :可以接收 char * 、const char *类型的参数;③实参可以传数组名、指针变量,或是一个字符串常量。
-
处理字符串的方式
1.字符串:在c语言中是按照字符数组的形式存储的。
字符串常量:存储在字符串常量区
2.处理字符串:
(1)char s[] = "hello"; //表示 在栈上开辟一块空间,用字符串常量中的 "hello"进行初始化。
(2) const char *p = "hello"; //表示 p指向了 字符串常量区中的 "hello",因为是指向了字符串常量区,所以只能做读取操作,不能修改。
(二)指针 操作 二维数组
-
二维数组
- c语言中并不存在,真正的二维数组。
- 二维数组本质 是一维数组的一维数组。
- 二维数组 也 符合数组的特点:连续性,有序性,单一性。
-
从二维数组的本质出发
int[3] a[2];
确定需要定义什么类型的指针?
-----> &a[0]
因为 a[0] 的类型是 int[3],即一个包含 3 个整数的一维数组类型,所以 &a[0] 就等价于 int[3] * ,但是C语言中不支持这种写法,故写成 int(*)[3] 。
int(*p)[3] = a; //p指向二维数组 a,p的基类型 int[3]
*p <=> a[0] // 相当于是内部这个一维数组的数组名
---> (*p)[0] ---> *(*p+0) ---> **p
因为 *(*(p+1)+1) <=> a[1][1],所以: *(*(p+i)+j) <=> a[i][j]
注意:二维数组的操作是从二维数组的本质上进行的,二维数组本质是一维数组的一维数组,所以直接的访问操作就是一维 一维的展开。
(三)部分字符串函数
-
strncpy
char *strncpy(char *dest, const char *src, size_t n)
- 将
src
所指向的字符串的前n
个字符复制到dest
所指向的字符数组中。 - 如果
src
字符串的长度小于n
,则在dest
中填充剩余的位置为'\0'
。如果src
字符串的长度大于或等于n
,则dest
不会以'\0'
结尾。 - 代码实现:
char *Strncpy(char *dest, char *src, size_t n)
{
char *ret = dest;
while (*src != '\0' && n!=0)
{
*dest++ = *src++;
--n;
}
while(n)
{
*dest++ ='\0';
--n;
}
return ret;
}
-
strncat
char *strncat(char *dest, const char *src, size_t n)
- 将
src
所指向的字符串的前n
个字符连接到dest
所指向的字符串的末尾。 - 如果
src
字符串的长度小于n
,则将整个src
字符串连接到dest
后面。如果连接后的总长度超过了dest
所分配的空间,可能会导致缓冲区溢出错误。 - 代码实现:
char *Strncat(char *dest, char *src, size_t n)
{
char *ret = dest;
while(*dest != '\0')
dest++;
while(*src != '\0' && n)
{
*dest++ = *src++;
--n;
}
*dest = '\0';
return ret;
}
-
strncmp
int strncmp(const char *s1, const char *s2, size_t n);
- 比较
s1
和s2
所指向的字符串的前n
个字符。 - 如果前
n
个字符相同,则返回 0;如果s1
小于s2
,则返回负数;如果s1
大于s2
,则返回正数。 - 代码实现:
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;
}
-
memcpy
void *memcpy(void *dest, const void *src, size_t n)
- 用于从
src
所指向的内存位置复制n
个字节到dest
所指向的内存位置。 - 这个函数不关心数据的类型,只是简单地按字节进行复制。它返回指向
dest
的指针。需要注意的是,dest
和src
所指向的内存区域不能重叠,否则可能会产生未定义的行为。 - void * :空类型指针,可以接收任何类型的指针。
- 代码实现:
void *Memcpy(void *dest, const void *src, size_t n)
{
char *p = dest;
const char *q = src;
while(n)
{
*p = *q;
p++;
q++;
n--;
}
}
标签:src,const,函数,dest,char,int,数组,字符串,指针 From: https://blog.csdn.net/weixin_62989562/article/details/140993045