c++ 指针相关1

156 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

const 指针相关

如果在定义变量的时候使用const去修饰指针,那么意味着无法通过该指针去修改它指向的值。

const 修饰的指针 指向数据有两种情况

//const 指针指向 普通的数据变量
//这个无法通过指针去修改数据值,但是变量本身可以修改自己的值
int a = 10;
const int *pt = &a;
*pt = *pt + 1 ; //不允许
a = a + 1; // 允许

// 因此这种功能一般用在函数的形参上,目的是防止再函数中修改元数据
  • const 指针 指向const定义的数据常量
//  无论什么情况都无法修改常量a的值
const int a = 10;
const int *pt = &a;

上面的两种情况都是常量指针无法修改指向常量的值,但是常量指针可以还可以指向别的元素

// 常量指针可以还可以指向别的元素
int a = 10;
int b = 20;
const int *pt = &a;
p = &b;

// 如果想让常量指针只能指向当前的地址可以这样定义
int a = 10;
int * const point = &a;

对于c++来说,禁止将const地址赋值给普通的指针

二维数组传参

对于函数原型中传递的二维数组的定义有两种

// 它们两个是等价的,4表示的是列数
// 使用数组名
int ar[][4]

// 使用指针
int (*ar)[4] 

// 对于获取二维函数值的方法,这两个是等价的(r 表示第几行,c表示第几列)
ar[r][c] = *(*(ar + r) + c) 

函数与字符串

通常表示字符串的方式有三种

  • char 数组 并且字符结尾要有空字符
    • char s[10] = "mall";
  • 用引号括起来的字符串常量
    • String s = "mall"
  • 用指针指着的字符串常量
    • char *pt = "mall";

字符数组名和指针都代表着字符串的第一位元素地址,因为我们在定义函数原型的时候就需要指针来接收

函数原型定义

  • int c_in_str(const char * str);
    • const 表示传入的字符串不可修改

代码

传入一个字符串

#include<iostream>
unsigned int c_in_str(const char * str, char ch);

int main(){
        using namespace std;

        char wills[10] = "helloworl";
        char *wname = "mmsa";
        unsigned int wn = c_in_str(wname,'s');
        unsigned int wi = c_in_str(wills,'o');
        cout << "wn is " << wn << endl;
        cout << "wi is " << wi << endl;
        return 0;
}

unsigned int c_in_str(const char * str , char ch){
        // 这里接收参数就相当于 char * str = &wname 和 char * str = &wname
        // 如果这么理解的话我就可以理解了
        unsigned int count = 0;
        while(*str){
                if(*str == ch) {
                        count++;
                }
                // 地址往前加1
                str++;
        }
        return count;
}

返回一个字符串

// 返回一个字符串也就是返回一个地址
// 原型定义,使用new运算符创建空间,并在数组尾部添加空字符,最后将指针返回即可
char * c_char(char x,int n) {
	char * prst = new char[n+1];
    prst[n] = '\0';
    while(n-- > 0) {
        prst[n] = x;
    }
    // 将指针传回
    return prst;
}

注:当我们需要使用delete[] 去释放 new 出来的内存时,我们在分配内存空间的时候只能使用下面这种形式:

// 例如:
str = new char[1];
str = '\0';

char word[15] = "good idea";
//而不是
str = new char;
char *p = word;


// 它们两者分配的内存量是相同的,但是上面那种分配方式兼容析构函数,而后者不兼容

空指针

有以下几种方式可以表示空指针:

  • 字面量0有两种含义,可以表示数字0也可以表示空指针。但是不利于代码阅读
    • char *st = 0;
  • 使用NULL表示,这是C语言中的表示方法
  • C++提供了新的表示方式。引入关键字nullptr(推荐)
    • char *st = nullptr;