字符串与指针、数组指针

一、常量字符串与字符串数组

        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()函数的工作原理是直接在内存级别复制字节数据。不进行任何类型检查或优化,而是逐字节地将数据从源地址复制到目标地址。

  1. 逐字节复制:

    • memcpy() 从源地址 src 开始,逐字节地读取数据,并将这些数据写入到目标地址 dest
    • 复制的字节数由参数 n 指定。
  2. 指针操作:

    • 源地址和目标地址通过指针传递,因此函数能够直接操作内存地址。
    • 复制操作是按照内存地址的顺序进行的,从 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值