- 一级指针
- 指针变量的定义:类型*,解引用:*变量名
- 指针变量也称地址变量(保存地址):int* p=&a; int a=10;
- 指针变量保存相同数据类型
- 元素访问:*p->解引用,int* p=&a;*p=20;(间接访问)
- 指针与数组的关系
- 数组首元素地址为:arr(数组名)
- 数组名+1->加一个单元格(与类型有关)
- *arr=arr[0] 表示数组首元素地址->*(p+i)=p[i]
- 野指针:int* p;悬挂指针,不可解引用
- 空指针:int* p=NULL;不可解引用
3.指针与const的结合
(1)int a=10; const int* p=&a; ->不能修改指向变量的值
p=&b;//right *p=100;//error
可以指向a,也可以指向b,不能修改a
(2)int a=10; int* const p=&a; ->修改指针变量本身
P=&b;//error *p=100;//right
一经指向a,不能指向其他地址,没有限定a本身的值是否被改变
(3)const int a=10;//a为常变量
int* p=&a;//error *p=10;//error
const int* p=&a;//right
a本身的值已经确定,不能改变a的值
(4)const int* const p=&a;
-> p指向a,不能指向其他变量,p不能改变a本身的值
4.字符串相关操作
(1)字符串定义
A. char ch[ ]="hello";(可以修改hello本身)
字符串长度:int len_ch=sizeof(ch)/sizeof(ch[0]); ->6=5+1(‘\0’)
int len_string=strlen(ch); ->5第一个‘\0’前面字符个数
const char* p=&a;(不能修改hello本身)
char* p=”hello”;//error
B.char ch[]={‘h’,’e’,’l’,’l’,’o’};
字符串长度:int len_ch=sizeof(ch)/sizeof(ch[0]); ->5(无‘\0’)
结尾标记:以‘\0’作为结尾标记
(2)两个字符串之间的关系
A.字符串长度函数*********************************************
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* str = "defghi";
int res = my_strlen(str);
printf("%d", res);
}
B.字符串比较操作***************************************************
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 != NULL && str2 != NULL);
while (*str1 == *str2)
{
if (*str1 == '\0' && *str2 == '\0')
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
{
return 1;
}
else if (*str1 < *str2)
{
return -1;
}
}
int main()
{
const char* str1 = "abc";
const char* str2 = "abs";
int res = my_strcmp(str1, str2);
printf("%d", res);
return 0;
}
C.字符串拷贝操作****************************************************
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 main()
{
char str1[10] = "abc";
const char* str2 = "defghi";
char* res = my_strcpy(str1, str2);
printf("%s", str1);
}
D.字符串拼接操作****************************************************
char* my_strcat(char* str1, const char* str2)
{
assert(str1 != NULL && str2 != NULL);
int len = strlen(str1);
int i = 0;
//给str1链接str2数据
for (; i < strlen(str2); i++)
{
str1[len + i] = str2[i];
}
str1[len + i] = '\0';//字符串结尾标记'\0'
return str1;
}
int main()
{
char ch[10] = "abc";//'\0'
char* res = my_strcat(ch, "def");//def链接在abc后面
//strcat(char *str1,const char *str2)
printf("%s", res);
return 0;
}