const char *p和char *const p的区别,以及在strstr函数当中的使用

(1) const int i

使用const 修饰的i我们称之为符号常量,即i不能在其他地方重新赋值。const int i和int const i是等价的。

(2) const int *p

从右向左看,先结合* 再结合const,定义一个指针指向一个常量,不能通过指针来修改这个指针指向的值。

看例子:
int i1=30;
int i2=40;
const int *p=&i1;
p=&i2;  //此处,p可以在任何时候重新赋值一个新的内存地址。
i2=80;  //这里能用*p=80来代替吗?答案是不能
printf("%d",*p);  //输出80
分析:p的值是可以被修改的,即它可以重新指向另一个地址。但是不能通过*p来修改i2的值。
首先,const修饰的是整个*p(注意,是*p而不是p),所以*p是常量,是不能被赋值的。虽然p所指的i2是变量而不是常量;
其次,p前并没有用const修饰,所以p是指针变量。能被赋值重新指向另一个内存地址。

(3)int * const p
先看const再看* ,p是一个常量类型的指针,不能修改这个指针的指向,但是这个指针所指向的地址上存储的值可以修改。

int i1=30;
int i2=40;
int * const p=&i1;
//p=&i2;  错误的。p不能再指向另一个新地址了。
i1=80;  //这里能用*p=80来代替,即可以通过*p修改i1的值。
printf("%d",*p);
分析:
此时p的值不能被赋值修改了,只能永远指向初始化时候的内存地址。相反,可用*p修改i1的值了。
所以:综上所述,
指针p因为有了const的修饰,所以为指针常量,即,指针p不能修改了。
整个*p前面没有const修饰,则*p为变量而不是常量,所以,可改变*p的值。
如果const修饰在*p前则不能改的是*p,而不是指p;
如果const是直接写在p前,则p不能改。

【C语言实现strstr】

#pragma warning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strstr(const char *str,const char *sub_str)
{
	assert(str);
	if (*sub_str == '\0')
	{
		return NULL;
	}
    //char *cp = (char *)str;
	//char *sub_cp = (char *)sub_str;
	const char *cp = str;
	const char *sub_cp = sub_str;
	while (*str)
	{
		sub_str = sub_cp;
		str = cp;
		while (*str && *sub_str && *str == *sub_str)
		{
			str++;
			sub_str++;
		}
		if (*sub_str == '\0')
		{
			return cp;
		}
		else if (*str == '\0')
			return NULL;
		cp++;
	}
	return NULL;
}
int main()
{
	char str1[] = "abcdef1234";
	char str2[] = "abc";
	char *ret = my_strstr(str1, str2);
	if (ret)
		printf("%s\n", ret);
	else
		printf("NULL\n");
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41318405/article/details/80081924
今日推荐