Day2 初始指针

上期回顾:

1.一级指针的定义和使用

2.传值和传址

3.一级指针的一系列操作(指针+-整型,一级指针和const的结合)

 

上期思考题

int main() {
    const int a = 10;
    const int b = 20;
    int* const p = &a;//1
    const int* const q = &a;//2
    const int* s = &b;//3
    s = &a;//4
    *s = 2;//5
    int* const t = &a;//6
    t = &b;//7
    *t = 1;//8
 
}

 

错误的有

1,5,6,7

解释:

因为我们使用常变量定义a和b的值,a和b的值不能发生变化,因此我们不能使用*x(指向他们的指针)去改变他们的值,即const int *x=&a && const int *x=&b;所以1,6错误

因为我们使用const int *s=&b;所以不能通过 *s去改变所指向的值,5错误

6中我们定义了t的指向是固定的,至于*t指向谁无所谓,7中改变了t的指向(由a到b)所以7错误

小结

const int *p:固定了 *p指向的值 即常变量的值

int * const p:固定了指针p的指向,即保存的地址

const int*const p:不仅固定了指针p的指向,而且固定了 *p即不能通过 *p去改变变量的值

使用一级指针封装strlen,strcpy,strcmp,strcat

my_strlen

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strlen(const char* p) {
	assert(*p != NULL);
	int count = 0;
	while (*p++!= '\0') {
		count++;
	}
	return count;
}
int main() {
	char arr[] = "hello world0";
	const char* p = "hello world";
	printf("%d\n", my_strlen(arr));
	printf("%d\n", my_strlen(p));
}

my_strcpy

#include<stdio.h>
#include<string.h>
#include<assert.h>
void my_strcpy(char* src, const char* str) {
	assert(*str != NULL);
	while (*str != '\0') {
		*src = *str;
		src++;
		str++;
	}
	*src = '\0';
}
/*void my_strcpy2(char* str, const char* src) {
	assert(*src != NULL);
	while (*str++ = *src++);
	*str = '\0';
}
*/
int main() {
	char arr[] = "hello world";
	char brr[100] = "";
	my_strcpy(brr, arr);
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++) {
		printf("%c", brr[i]);
	}
}

my_strcat

char*  my_strcat(char* str, const char* src) {
	assert(*str != NULL && *src != NULL);
	char* ret = str;
	while (*str != '\0') {
		*str++;
	}
	while (*str++ = *src++);
	*str= '\0';
		return ret;
}

my_strcmp

int my_strcmp(const char* str, const char* src) {
	assert(*str != NULL && *src != NULL);
	while (*str++ != '\0' && *src++ != '\0') {
		if (*str > *src) {
			return 1;
		}
		else if (*str < *src) {
			return -1;
		}
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值