一、常量字符串与字符串数组
s[100] "Hello World"
区别:
存储位置:栈区 字符串常量区
有名数组 匿名数组
二、字符串指针(指向字符串的指针)
char s[] = "hello world";
char *p = s;
也可指直接用一个指针指向字符串(字符串常量)
char *p = "hello world"
其中指针p保存的时字符串中“H”的地址,第二种形式字符串存储在字符串常量区。字符串常量只有读取权限,没有写入权限,这就导致了字符数组 在定义后可读取和修改每个字符而 第二种形式(字符串常量) 一旦定义后便不可修改,不能进行赋值。
puts("Hello world");
其实这里接收的是首元素的地址。
三、const关键字作用
const int *p
指针变量可以被修改,但是表示的通过指针指向的变量无法被修改,只能读取。
int *const p
表示变量p不能被修改。
const int * const p
表示变量p和指针变量*p都不能被修改。
在调用函数中也可以对函数中的形参进行修饰,例如
void Puts(const char *s)
const在这里的功能可以理解为 函数的这段功能不能被修改,但同时也提高了参数的适应性,可以定义字符型,也可以定义int型等等。
char *p = "China";
sizeof(p) // = 8 表示地址的长度
strlen(p) // = 5 表示有效字符的个数
strncpy() 函数
char *strncpy(char *dest, const char *src, size_t n);
参数
- dest:指向能存放 n 个字符的数组。
- src:指向源字符串(字符数组)。
- n:要复制的字符数量。
返回值
返回参数 dest 的值,即返回一个指向存放 n 个字符的数组指针。
也就是说,strncpy()函数是将 src 指向的前 n 个字符拷贝到 dest 字符数组中:
- 如果 src 的长度小于 n,strncpy() 函数将在 dest 的剩余部分用空字符填充,凑齐 n 个字符。
- 如果 src 的长度大于或等于 n,则复制的字符串将不会以空字符结尾。这可能会导致程序崩溃。
万能指针
其类型为
void *p
例如内存拷贝函数中就需要运用这些万能指针
memcpy() 的功能是将某块内存中的 n 的字节拷贝到另一块内存里 ,memcpy() 函数的原型如下。
void *memcpy(void *dest, const void *src, size_t n);
其中,对于参数而言:
dest
:目标内存地址的指针,表示数据的复制去向。src
:源内存地址的指针,表示数据的复制来源。n
:要复制的字节数。
memcpy() 函数的工作原理
memcpy()函数的工作原理是直接在内存级别复制字节数据。不进行任何类型检查或优化,而是逐字节地将数据从源地址复制到目标地址。
-
逐字节复制:
- memcpy() 从源地址
src
开始,逐字节地读取数据,并将这些数据写入到目标地址dest
。 - 复制的字节数由参数
n
指定。
- memcpy() 从源地址
-
指针操作:
- 源地址和目标地址通过指针传递,因此函数能够直接操作内存地址。
- 复制操作是按照内存地址的顺序进行的,从
src
开始依次向后复制n
个字节到dest
。
memcpy()代码原理
void *Memcpy(void *dest, const void *src, int n)
{
void *ret = dest;
char *p = (char *)dest;
char *q = (char *)src;
while(n--)
{
*p++ = *q++;
}
return ret;
}
三、数组指针
int(*p)[10] 表示指向长度为10的一位整型数组的指针
int *p[10] 指针数组,定义了10个指针变量
a <==> &a[0] //int (*)[4] 指向长度为一维数组长度数组指针
a[0] <==> &a[0][0] // int * 指针
&a // int (*)[3][4] 二维指针 *(*(a+i)+j);
*(a+i) 表示二维数组第i行
*(a+i)+j 表示二维数组第i行
*(*(a+i)+j)