指针、字符串函数

(一)指针 操作 一维字符型数组

  • 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 离谁近,就限定谁

  • 应用

  1. 如果不想通过 *p 的方式改变基类型对应的数据:                                                                      const  int  *p = &a;       或         int  const *p = &a;                                                                   
  2. 如果指针 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",因为是指向了字符串常量区,所以只能做读取操作,不能修改。

(二)指针 操作 二维数组

  • 二维数组

  1. c语言中并不存在,真正的二维数组。
  2. 二维数组本质 是一维数组的一维数组。
  3. 二维数组 也 符合数组的特点:连续性,有序性,单一性。
  • 从二维数组的本质出发

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)

  1. 将 src 所指向的字符串的前 n 个字符复制到 dest 所指向的字符数组中。
  2. 如果 src 字符串的长度小于 n,则在 dest 中填充剩余的位置为 '\0'。如果 src 字符串的长度大于或等于 n,则 dest 不会以 '\0' 结尾。
  3. 代码实现:
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)

  1. 将 src 所指向的字符串的前 n 个字符连接到 dest 所指向的字符串的末尾。
  2. 如果 src 字符串的长度小于 n,则将整个 src 字符串连接到 dest 后面。如果连接后的总长度超过了 dest 所分配的空间,可能会导致缓冲区溢出错误。
  3. 代码实现:
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);

  1. 比较 s1 和 s2 所指向的字符串的前 n 个字符。
  2. 如果前 n 个字符相同,则返回 0;如果 s1 小于 s2,则返回负数;如果 s1 大于 s2,则返回正数。
  3. 代码实现:
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)

  1. 用于从 src 所指向的内存位置复制 n 个字节到 dest 所指向的内存位置。
  2. 这个函数不关心数据的类型,只是简单地按字节进行复制。它返回指向 dest 的指针。需要注意的是,dest 和 src 所指向的内存区域不能重叠,否则可能会产生未定义的行为。
  3. void * :空类型指针,可以接收任何类型的指针。
  4. 代码实现:
void *Memcpy(void *dest, const void *src, size_t n)
{
	char *p = dest;
	const char *q = src;

	while(n)
	{
		*p = *q;
		p++;
		q++;
		n--;
	}

}

​​

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘 要 伴随着人才教学的关注度越来越高,对于人才的培养也是当今社会发展的最为重要的问题之一。为了进一步的进行人才的培养关工作,许多的学校或者是教育的机构逐步的开展了网络信息化的教学和和管理工作,通过信息化的手段和技术实现网络信息化的教育及管理模式,通过网络信息化的手段实现在线答题在线考试和学生信息在线的管理等操作。这样更加的快捷解决了人才培养之中的问题,也在进一步的促进了网络信息化教学方式的快速的发展工作。相较于之前的人才教育和培养工作之中,存在这许多的问题和局限性。在学生信息管理方面通过线下管理的形式进行学生信息的管理工作,在此过程之中存在着一定的局限性和低效性,往往一些突发的问题导致其中工作出现错误。导致相关的教育工作受到了一定的阻碍。在学生信息和学生成绩的管理方面,往常的教育模式之下都是采用的是人工线下的进行管理和整理工作,在这一过程之中存在这一定的不安全和低效性,面对与学生基数的越来越大,学生的信息管理也在面领着巨大的挑战,管理人员面领着巨大的学生信息的信息量,运用之前的信息管理方式往往会在统计和登记上出现错误的情况的产生,为后续的管理工作造成了一定的困难。然而通过信息化的管理方式进行对学生信息的管理不仅可以避免这些错误情况的产生还可以进一步的简化学生信息管理工作的流程,节约了大量的人力和物力的之处。在线答题系统的实现不仅给学生的信息管理工作和在线考试带来了方便也进一步的促进了教育事业信息化的发展,从而实现高效化的教学工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值