上期回顾:
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;
}