文章目录
一、指针的作用
1、对指针的理解(指针是什么?)
1、语法作用
指针是一种数据类型,它可以定义变量,变量保存的值是地址
,由于地址是固定长度,所以指针变量的长度是固定长度,不同地址的步长不一样,需要不同指针类型的变量来保存
int *p;//整型指针变量;p是一个变量,保存的是地址,该地址是整型类型的地址
char *p2;//字符指针变量;p2是一个变量,保存的是地址,该地址是字符型类型的地址
2、功能作用
由于指针变量可以保存地址,所以可以直接操作地址,也就是可以直接操作硬件的寄存器地址,从而可以直接访问硬件
2、问题:地址为什么分为不同类型?——不同类型的指针变量保存不同步长的地址
地址属性:步长(做加1操作所移动的字节数)
地址+操作数=地址
eg:0x0000001+1
int main()
{
int num = 3;
char a = 'a';
printf("&num = %p\n",&num);
printf("&ch = %p\n",&ch);
return 0;
}
二、*与&(对应的内存空间(地址)和指向的内存空间(值))
p++:p对应的内存空间
(*p)++:指向的内存空间
支持的运算符:
*:间接运算符
&:取地址运算符
2、&p 如何保存:多级指针
三、多级指针(保存上一级指针变量地址)(原指针(巨指针)、近指针)
int *p;
int **pp;//整型指针的指针变量
pp是一个变量,保存的是地址,该地址对应空间保存的还是地址,这个地址是整型的地址
pp == &p == 地址;
*pp == p ==地址;
**pp == *p == num;
&pp如何保存(地址如何保存):多级指针
***ppp == &pp;
应用场景:函数传参
void func(char **ptr)
{
(*ptr)++;
}
int main()
{
char *ptr = "hello world!"
func(&ptr);
printf("ptr = %s\n",ptr);
return 0;
]
指针之间的运算
赋值
指针之间的赋值:相同类型指针之间赋值
int main()
{
}
void *:万能指针:可以接收任何类型指针的值
void *func()//万能指针
{
int num = 4;
return #
}
int main()
{
int *temp = (int *)func();//强制类型转换
char *ptr = (char *)malloc(sizeof(char) * 100);//强制类型转换
}
运算
p+操作数 指针+指针(不支持)
p-操作数 (支持)指针-指针(支持)(高地址-低地址(相差数据类型的元素个数))
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
int *p1 = a;
int *p2 = &a[5];
printf("%ld\n",p2-p1);//输出5,元素个数
return 0;
}
题目
统计一个字符串中连续最长数字子串的个数并输出
#include <stdio.h>
#include<stdlib.h>
int continue_max_ptr(char *ptr)
{
int max_len = 0;
int len = 0;
while(*ptr != '\0')
{
while(*ptr >= '0' && *ptr <= '9' && *ptr != '\0')
{
len++;
ptr++;
}
if(len > max_len)//单次循环用if,多次循环用while
{
max_len = len;
}
len = 0;
ptr++;
}
return max_len;
}
int main()
{
char *ptr = (char *)malloc(sizeof(char) * 100);//扩大字节长度
printf("Please input ptr:\n");
scanf("%s",ptr);
printf("ptr = %s\n",ptr);
int max_len = continue_max_ptr(ptr);
printf("max_len = %d\n",max_len);
return 0;
}
四、野指针
五、字符串
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
void func(char *s1,char *s2)
{
}
int main()
{
char *ptr = "hello world!";//保存在数据段的or段,该数据不能被修改
ptr++;
//(*ptr) = 'E';错
char src[100] = "hello world!";//保存在栈中
char *str = (char *)malloc(sizeof(char) * 100);
//func("hello1","hello2");//传的是s1 s2的首地址 也是在or段,数据不可以修改
func(src,str);//数据可以修改
strcpy(str,"hello world!");
printf("hello world = %p\n","hello world");//此处hello world是常量
printf("ptr = %p\n",ptr);
printf("src = %p",src);
printf("str = %p",str);
return 0;
}
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
size_t my_strlen(char *s)
{
size_t len = 0;
while(*s != '\0')
{
len++;
s++;
}
return len;
}
char *my_strcpy(char *dest,char *temp)
{
char *src = dest;
while(*temp !='\0')
{
*src = *temp;
temp++;
src++;
}
*temp = '\0';
return dest;//返回“\0‘地址
}
int main()
{
char *ptr = "hello world";
char src[100] = "hello world";
char *str = (char *)malloc(sizeof(char) * 100);
if(NULL == str)
{
printf("malloc error!\n");
exit(1);
}
int len = my_strlen(src);
int len = strlen(src);//size_t len = ..无符号长整型
int len1 = strlen("hello world");
printf("%d\n",len);
printf("%d\n",len1);
return 0;
}
include "stdio.h"
#include "string.h"
int main()
{
char str[50];
char ptr[20];
str = "I am a student.";
ptr = "xuchunlan";
//strcat(str, ptr); //字符串连接,ptr在str后面
strcpy(str, ptr); //字符串复制
/*strncp(str, ptr); //字符串复制
int x = strcmp(str, ptr); //比较两个字符串,看返回值(大于、等于、小于0)
int m = strlen(str); //求字符长度,不包括'\0'
//sizeof分配的内存空间大小
strlwr(str); //字符串转小写
strupr(str); //字符串转大写 */
printf("%c\n", str);
return 0;
}