指针、字符串


一、指针的作用

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_49181551

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值