一.一级指针
三级指针只能关联二级指针地址,二级指针只能关联一级指针地址,一级指针只能关联变量地址
int main()
{
int a = 10;
int b = 20;
int* p = &a;
*p = 100;
p = &b;
*p = 200;
int** pp = &p;
**pp = 1000;
*pp = &a;
**pp = 2000;}
二.指针和数组的关系
数组名+整型:
arr :数组首元素地址
数组名+1 -> 加单元格(类型有关)
例如:(1)*(arr+1) <=> arr[1]
(2)*arr <=> arr[0]
数组和指针关系:(p+i) <==>&p[i]
const char *str="hello";
*(str+i)='z';//error
*(str+i) -> str[i]
三.指针和const结合
1.指针和const 的使用
const 放在* 前 :可以指向a但不能修改a
1)
int a=10;
int b=20;
const int* p = &a; // int const *p = &a
*p=100;//error
*p=&b;//right
*p=200;//error
2)
const 放在* 后
int a=10;
int b=20;
int* const p = &a; (修饰的是p本身)
->修饰的是指针变量本身。一经指向a,不能指向其他地址。没有限定a本身的值是否被修改。
p=&b;//error
*p=100;//right
3)
const int a=10;
int *p = &a;//error *p=10;//error
const int *p=&a;//right (p修饰的a是一个常量)
4)
const int* const p=&a;//p指向a,不能指向其他变量,p不能修改a的值
四.字符串的定义及特点
* 字符串:定义
* 1)char ch[]="hello"; 数组大小5+1 ‘\0'
* 2)char *p="hello";//error
* const char* str="hello";//right
* 字符串1="hello" 字符串2="world" 关系
* 1)字符串拷贝
* 2)字符串拼接操作
* 3)字符串比较操作:strcmp
* 字符串操作 char *p = "hello";
* 字符串定义,求字符串长度
* 字符串比较 strcmp
* 字符串拷贝 strcpy
* 字符串拼接 strcat
* 4)字符串"123" -> 整型123 "-123" -> -123 "+-+----123" -> -123
* atoi操作
* 5)itoa 整型:123 -> "123"
字符串基本认识
int main()
{
char ch[] = { 'h','e','l','l','o' };//5
char arr[] = "he\0llo";//7
int len_ch = sizeof(ch)/ sizeof(ch[0]);
int len_arr = sizeof(arr) / sizeof(arr[0]);
int len_string = strlen(arr);//第一个'\0'前面数据 //2 //(strlen)
printf("ch:%d arr:%d 字符串长度:%d", len_ch, len_arr, len_string);
return 0;
}
1>字符串比较 strcmp
方法1:
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 != NULL && str2 != NULL);
int len = strlen(str1);
for (int i = 0; i < len; i++)
{
if (str1[i] == str2[i])
{
continue;
}
else if (str1[i] > str2[i])
{
return 1;
}
else
{
return -1;
}
return 0;
}
/*while (*str1!=*str2)
{
if (*str1 < *str2)
{
return 1;
}
else if (*str1 > *str2)
{
return -1;
}
else
{
return 0;
}
}*/
}
int main()
{
const char* str1 = "abcde";
const char* str2 = "abcde";
int res = my_strcmp(str1, str2);
printf("%d", res);
return 0;
}
针对方法1的优化代码
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 != NULL && str2 != NULL);
int result = 0;
int len = strlen(str1);
for (int i = 0; str1[i] != '\0' && str2[i] != '\0'; i++)
{
if (str1[i] > str2[i])
{
result = 1;
break;
}
else if(str1[i] < str2[i])
{
result = -1;
break;
}
return 0;
}
}
方法2:指针形式操作
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 != NULL && str2 != NULL);
while (*str1 == *str2)
{
str1++;
str2++;
}
if (*str1 > *str2)
{
return 1;
}
else if (*str1 < *str2)
{
return -1;
}
return 0;
}
2>字符串拼接 stract
char* my_strcat(char* str1, const char* str2)
{
assert(str1 != NULL && str2 != NULL);
int len = strlen(str1);
//给str1连接str2数据
int i=0;
for (; i < strlen(str2); i++)
{
str1[len+i] = str2[i];
}
str1[len+i] = '\0';//字符串结尾标记‘\0‘
return str1;
}
unsigned int my_strlen(const char* str)
{
assert(str != NULL);
unsigned int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
const char* str1 = "abcde";
const char* str2 = "abcde";
char ch[10] = "abc";
char *res = strcat(ch,"def");
printf("%s", res);
return 0;
}
3>字符串拷贝 strcpy
char* my_strcpy(char* str1, const char* str2)
{
assert(str1 != NULL && str2 != NULL);
//指针实现方式
while (*str2 != '\0')
{
*str1 = *str2;
str1++;
str2++;
}
*str1 = '\0';
return str1;
//数组实现方式
/*int len = strlen(str2);
for (int i=0; i < strlen(str2); i++)
{
str1[i] = str2[i];
}
str1[len] = '\0';
return str1;*/
}
int main()
{
char str1[10] = "abc";
const char* str2 = "defghi";
char* res=my_strcpy(str1, str2);
printf("%s", res);
}