第九章 指针2

本文深入讲解C/C++中的指针,涵盖指针与二维数组的关系、指向指针的指针的定义与使用,以及void指针在内存操作函数memset和memcpy中的应用。此外,还介绍了函数指针的概念和快速排序库函数qsort的使用方法,结合实例展示如何实现数组的排序。
摘要由CSDN通过智能技术生成

1、指针和二维数组

如果定义二维数组:

T a[N][M];
  • a [ i ] a[i] a[i] 是一个一维数组

  • a [ i ] a[i] a[i] 的类型是 T*

  • sizeof(a[i]) = sizeof(T) * M

  • a [ i ] a[i] a[i] 指向的地址:数组 a 的起始地址 + i * M * sizeof(T)

    void Reverse(int * p , int size)
    {
         
       for(int i = 0; i < size / 2; i++)
       {
         
       	int tmp = p[i];
       	p[i] = p[size - i - 1];
       	p[size -i - 1] = tmp;	
       }	
    }
    int a[3][4] = {
         {
         1 , 2 , 3 , 4} , {
         5 , 6 , 7 , 8} , {
         9 , 10 , 11 , 12}};
    
    Reverse(a[1] , 4);
    =>{
         {
         1 , 2 , 3 , 4} , {
         8 , 7 , 6 , 5} , {
         9 , 10 , 11 , 12}};
    
    //二维数组在内存中是连续存放的。
    Reverse(a[1] , 6)
    =>{
         {
         1 , 2 , 3 , 4} , {
         10 , 9 , 5 , 6} , {
         7 , 8 , 11 , 12}};
    

2、指向指针的指针

  • 定义:T ** p

  • p p p 是指向指针的指针, p p p 指向的地方应该存放着一个类型为 T * 的指针,*p 的类型是 T *

    #include<iostream>
    using namespace std;
    int main()
    {
         
    	int **pp;  //指向int*类型指针的指针
    	int *p;
    	int n = 1234;
    	p = &n; //p指向n
    	pp = &p;  //pp指向p
    	cout << *(*pp) << endl; 
    	return 0;
    }
    

在这里插入图片描述

3、指针和字符串

  • 字符串常量的类型就是 char *

  • 字符数组名的类型也是 char *

    #include<iostream>
    using namespace std;
    int main()
    {
         
    	//p指向的就是一片空间,这个空间存放的就是please input your name
    	char *p = "Please input your name:\n"; 
    	cout << p;
    	char name[20];
    	char *pName = name;
    	cin >> pName;
    	cout << "Your name is " << pName;
    	return 0;
    }
    

在这里插入图片描述

  • 字符数组名的类型也是 char *,就是一个地址。

    char name[20];
    int n;
    scanf("%d%s", &n , name);//&n改为n,编译不会出错,但是此时n的内容就被当做一个地址,但实际他不是一个有效地址。
    cin >> n >> name;
    

4、字符串操作库函数

函数名称 功能
strcat 将一个字符串连接到另一个字符串后面
strchr 查找某字符在字符串中最先出现的位置
strrchr 查找某字符在字符串中最后出现的位置
strstr 求子串的位置
strcmp 比较两个字符串的大小(大小写相关)
stricmp 比较两个字符串的大小(大小写无关)
strcpy 字符串拷贝
strlen 求字符串长度
strlwr 将字符串变成小写
strupr 将字符串变成大写
strncat 将一个字符串的前n个字符连接到另一个字符串后面
strncmp 比较两个字符串的前n个字符
strncpy 拷贝字符串的前n个字符
strtok 抽取被指定字符分隔的子串
atoi 将字符串转换为整数(在cstdlib中声明)
atof 将字符串转换为实数(在cstdlib中声明)
itoa 将整数转换为字符串(在cstdlib中声明)
  • char * strchr(const char * str , int c);
    寻找字符 c c c 在字符串 s t r str str 中第一次出现的位置。如果找到,就返回指向该位置的 c h a r ∗ char* char 指针;如果 s t r str str 中不包含字符 c c c,则返回 N U L L

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zaiyang遇见

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

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

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

打赏作者

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

抵扣说明:

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

余额充值