我们都知道,指针是指向一段内存空间的。而这个内存空间也可以存放下一个内存空间的地址,这样一级级的传递下去,就变成了多级指针。在C语言中,多级指针是经常会用到的。 多级指针像一把双刃剑,有利也有弊。...其中,指针有一个非常重要的作用:间接赋值。...这个时候,你就可以将这个字符串指针的地址传递给函数。这样,函数的参数就是一个二级指针了,通过这个二级指针,你可以很方便的修改字符串的内容。...; //间接赋值 *p1 = temp; //更改指针所指向的内存空间 printf("T1 %d\n",*p1); //打印出地址 } int Test2(char *p2) {...; printf("T2 %d\n",p2); //打印出地址 ,会发现和实参的地址一样 } //间接赋值 //利用n级指针 改变n-1级指针的值 int main(int argc,char
C.152: Never assign a pointer to an array of derived class objects to a pointer to its base C.152:永远不要将派生类数组的指针赋值给基类指针...作为赋值结果的基类指针的下标运算会引起无效的对象访问并可能发生内存破坏。...don't let the array name suffer a derived-to-base conversion before getting into the span 使用span传递数组而不是指针...原文链接: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c151-use-make_shared-to-construct-objects-owned-by-shared_ptrs...---- 觉得本文有帮助?
文章目录 前言 一、在函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 ) 二、完整代码示例 前言 如果要 通过 函数形参 间接赋值 修改 n 级指针, 需要向函数中传入 n + 1...级指针 形参 ; 一、在函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 ) ---- 通过 函数 形参变量 , 间接赋值 返回 生成的 二级指针 函数 ; 如果要生成一个 二级指针 ,...进行赋值 ; 代码示例 : /** * @brief 生成二维指针 * @param num * @return */ int generate_memory(char ***p3, int...// 用于存储 num 个 一维指针 // 每个 一维指针 指向一块内存空间 p = (char **)malloc( sizeof(char*) * num ); if(p...// 用于存储 num 个 一维指针 // 每个 一维指针 指向一块内存空间 p = (char **)malloc( sizeof(char*) * num );
在C++中,智能指针是一种特殊类型的指针对象,它能自动管理内存的分配和释放。...智能指针与裸指针(即传统的指针)之间有以下区别: 自动资源管理:智能指针通过使用引用计数或其他机制来自动管理内存资源的分配和释放。...这意味着当不再需要指针指向的对象时,智能指针会自动释放内存,避免了内存泄漏和悬空指针的风险。 所有权管理:智能指针可以跟踪和共享对对象的所有权。...这意味着多个智能指针可以指向同一个对象,并且会在所有智能指针都不再需要该对象时才释放内存。 方便性:智能指针提供了一些便捷的操作和语法。...例如,可以使用箭头操作符(->)访问智能指针指向的对象,就像使用裸指针一样。同时,通过重载了解引用操作符(*),智能指针也可以以类似指针的方式使用。 需要注意的是,智能指针并非万能解决方案。
void foo(int);void foo(char*);foo(nullptr); // 调用foo(char*)在这个例子中,foo(nullptr)会调用foo(char*),因为nullptr...更进一步:为什么要引入nullptr,解决了NULL带来的什么问题?C++11引入nullptr的主要原因是为了解决NULL在C++中存在的一些问题和限制。...而nullptr是一个真正的空指针,它只能赋值给指针类型的变量,不能赋值给整数类型的变量,这提高了类型安全。...函数重载问题:如果你有两个重载的函数,一个接受整数类型的参数,一个接受指针类型的参数,然后你传递NULL作为参数,编译器会选择接受整数类型参数的函数,而不是你可能期望的接受指针类型参数的函数。...代码清晰度问题:NULL在C++中是一个整数0,这可能会使代码的意图不清晰。例如,如果你看到int* p = NULL;,你可能会困惑,为什么一个指针被赋值为一个整数0。
空指针赋值 上学期刚学C语言的时候很迷,老师说要避免野指针,但是空指针似乎又没办法赋值,就只好尽量减少指针的使用。...今天查了一下发现是这样赋值的: 先把要赋值的变量的地址赋给空指针,然后才能把变量的值赋给该指针。...e = &L.list[i - 1]; *e = L.list[i - 1]; e是之前定义的一个空指针 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126085
一、一级指针 char *a=”a”; char *b=”b”; a=b;//这个是b把存的内容b给a,此时a的内容是b,所以指针与指针赋值实际也是传值,和普通变量一样。...若a的内容变为c,则b的内容还是b 二、二级指针 char **c=&a; char **d=&b; c=d;//这样是把b的地址给了c,此时d和c都指向b,若c的内容发生改变,那么b和d的内容也发生改变
为方便各位小伙伴更好的学习C语言,武林技术小编为此给大家整理了一批资料,供大家交流学习,下面就跟随武林技术频道的编辑一起来先来看看关于C语言指针赋值的问题。...= ‘/0’){ printf(“%c”, *p); printf(“%c”, *(p+1)); ++p; } } 警报如下: test.c:21: 警告: 赋值时将指针赋给整数,未作类型转换 test.c...:22: 警告: 赋值时将指针赋给整数,未作类型转换 test.c:23: 警告: 赋值时将指针赋给整数,未作类型转换 test.c:24: 警告: 赋值时将指针赋给整数,未作类型转换 test.c:25...: 警告: 赋值时将指针赋给整数,未作类型转换 test.c:29: 警告: 传递参数 1 (属于 ‘display’)时将整数赋给指针,未作类型转换 其中21-25就是 set[0] = h; set...以上就是关于C语言指针赋值的问题,想必都已有了一定的了解,更多关于C语言的内容请继续关注武林技术频道。
p1 = p2; //注意啦,p1指向了val2,而没有指向val1 备注:字符串与指针的初始化和赋值 初始化: char *cp = “abcdefg”; //这个初始化过程,是将指针cp指向字符串的首地址...因为,在C语言里面,没有整体处理一个字符串的机制 赋值: cp = “abcdefg”; *cp=”abcdefg” ;//错误!...对于这个赋值问题还可以换一个角度去理解,在C语言中,使用赋值操作符时,赋值操作符左边和右边的表达式类型应该是相同的,如果不是,赋值操作符将试图把右边表达式的值转换为左边的类型。...对指针进行初始化时常用的有以下几种方式: 1.采用NULL或空指针常量,如:int *p = NULL;或 char *p = 2-2; 或float *p = 0; 2.取一个对象的地址然后赋给一个指针...,如:char *cp = “abcdefg”; 对指针进行初始化或赋值的实质是将一个地址或同类型(或相兼容的类型)的指针赋给它,而不管这个地址是怎么取得的。
; ② 实参地址赋值给形参 ; ③ 使用形参指针修改实参值 ; 间接赋值 3 大要素 : 要素 ① : 定义 实际变量 ( 实参 ) , 以及接收 实际变量 地址的 指针参数 ( 形参 ) ; 如果...NULL; 要素 ② : 将 实际变量 ( 实参 ) 地址 , 赋值给 形参 指针 ; // 实际变量 地址 , 赋值给 形参指针 // 该指针变量将来用作 函数参数 p = &a; 要素 ③...: 使用 形参指针 修改 实际变量 ( 实参 ) 的值 ; *p = 20; 二、间接赋值 使用场景 ---- 上述 间接赋值 3 要素 , ① 定义实参和形参 ; ② 实参地址赋值给形参 ;..., 并为其设置 NULL 初始值 // NULL 就是 0 char *p = NULL; // 将 a 的地址赋值给 指针变量 p p = &a;..., 并为其设置 NULL 初始值 // NULL 就是 0 int *p = NULL; // 将 a 的地址赋值给 指针变量 p p = &a; // 调用
一 简单示例 int a; const int c_a = 1; int* p; p = &a; p = &c_a; // error 即非const指针不能指向const数据(数据为非指针类型)。...int a; const int c_a = 1; const int* p1; p1 = &a; p1 = &c_a; 即const指针既可以指向const数据又可以指向非const数据(数据为非指针类型...,const指针赋值表现的并不一致(p3 = &p不通过,p3 = p2不通过)。...二 综上 如果数据类型本身并不是指针,则可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针。...二级间接关系中,需要注意const指针的赋值。
文章目录 一、直接赋值 和 间接赋值 二、在子函数中间接赋值 一、直接赋值 和 间接赋值 ---- 在 函数体 内部 , 声明普通变量 , 直接赋值 : 直接修改该变量 , 称为 直接赋值 ; 简介赋值...: 将该变量的地址 赋值 给指针 , 通过 指针 修改内存中的变量数据 , 称为 间接赋值 ; 代码示例 : #include #include int main...() { // 定义普通变量 int a = 0; // 声明指针变量 , 并为其设置 NULL 初始值 // NULL 就是 0 char *p = NULL...指针变量 p p = &a; // 通过指针 简介修改 变量 a 的值 // * 符号可以看做 内存空间 的钥匙 , 可通过地址找到内存 *p = 20; //...指针变量 p p = &a; // 通过指针 简介修改 变量 a 的值 // * 符号可以看做 内存空间 的钥匙 , 可通过地址找到内存 *p = 20; //
文章目录 一、指针作为 函数参数 ( 间接赋值 ) 的意义 二、间接赋值 代码示例 一、指针作为 函数参数 ( 间接赋值 ) 的意义 ---- 调用函数时 , 调用 & 取地址 生成 实参 p , 将...函数参数 , 可以实现 主函数 与 被调用子函数 之间 内存交换 ; 下面是逻辑链 : 指针作函数参数 ( 间接赋值 ) -> 接口封装与设计 -> 模块划分 -> 软件分层 正是因为有了 间接赋值 ,...解耦操作 , 实现了 模块化开发 ; 如果没有 指针 作为函数 , 就无法实现 功能分层 , 无法实现 模块化开发 , 就无法实现 接口 封装 与 设计 ; 二、间接赋值 代码示例 ---- 代码示例...(char **p, int *len) { // 堆内存 创建字符串 *p = (char *)malloc(20); // 向堆内存 拷贝字符串数据 strcpy(..., 并为其设置 NULL 初始值 // NULL 就是 0 char *p = NULL; // 在子函数中生成字符串 generate_string(&p, &len
文章目录 一、指针类型变量 与 指针指向的内存块 概念区别 1、指针赋值 2、指针运算 3、内存赋值 4、内存取值 5、内存修改注意事项 一、指针类型变量 与 指针指向的内存块 概念区别 ---- 指针类型变量...&a; 1、指针赋值 给指针赋值 : 给上述指针变量 p 赋值操作 , 如 p = 0x7F451D12 , 只改变指针变量 p 的值 , 没有改变指针变量 p 原来指向的 内存块 中存储的值 ; char...*p1 = (char *)malloc(100); *p1 = (char *)malloc(100); 上述操作中 , 第二次赋值 , 指针变量改变了 ; 此时 2、指针运算 指针算术运算 : 对上述指针进行算术运算..., p + 1 与 p++ 的计算结果是指针的地址值加上指针类型对应的字节大小值 , 如果是 int 类型的指针 , 则增加 4 字节 ; 3、内存赋值 ** 给指针指向的内存赋值 * 给上述指针变量...; 最容易出错的情况是 , 指针指向 字符串常量 , 强行修改该指针指向的内存 , 会导致出错 ; 下面的代码中 , 就会出现问题 ; char *p = "abc"; *p = "123";
disp(T i) { cout<<i<<endl; } int main() { int i = 1; int *p = &i; *p = 2; // 通过指针赋值...disp(i); int j = 10; // 对指针赋值,将指针p指向j p = &j; disp(*p); return 0; } 1 通过指针赋值...,即通过指针将其指向的值进行修改(例如上述代码中,通过指针p对i的值修改) 2 对指针赋值,即修改指针指向的地址(例如上述代码中,将指针p重新指向j) 3 对指针操作要保持类型的统一(例如上述代码中 i
p1 = p2; //注意啦,p1指向了val2,而没有指向val1 备注:字符串与指针的初始化和赋值 初始化: char *cp = "abcdefg"; //这个初始化过程,是将指针cp指向字符串的首地址...因为,在C语言里面,没有整体处理一个字符串的机制 赋值: cp = "abcdefg"; *cp=”abcdefg” ;//错误!...对于这个赋值问题还可以换一个角度去理解,在C语言中,使用赋值操作符时,赋值操作符左边和右边的表达式类型应该是相同的,如果不是,赋值操作符将试图把右边表达式的值转换为左边的类型。...对指针进行初始化时常用的有以下几种方式: 1.采用NULL或空指针常量,如:int *p = NULL;或 char *p = 2-2; 或float *p = 0; 2.取一个对象的地址然后赋给一个指针...,如:char *cp = “abcdefg”; 对指针进行初始化或赋值的实质是将一个地址或同类型(或相兼容的类型)的指针赋给它,而不管这个地址是怎么取得的。
在写程序的时候,总是搞混,现在总结一下以免以后再犯 char a[10]; 怎么给这个数组赋值呢?谭浩强的书上明确指出,字符数组可以在定义时整体赋值,不能再赋值语句中整体赋值。...1、定义的时候直接用字符串赋值 char a[10]=”hello”; 注意:不能先定义再给它赋值,如char a[10]; a[10]=”hello”;这样是错误的!...2、char a[10]; a=”hello”; 这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱...; C语言把这些语句解释为一个指针与另一个指针之间的(非法的)赋值运算。...因为str1和str2有不同的地址,所以表达式str1 == str2的值一定为0。
: 根据 函数指针 类型中的 参数列表类型 , 自动匹配 重载函数 ; 一、函数指针回顾 1、函数指针概念 之前的博客 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式...二、为函数指针赋值重载函数 ---- 1、为函数指针赋值重载函数 对 函数指针 进行赋值时 , 直接将 函数名 赋值给了 函数指针 ; 如 下面的代码中 , 直接将 add 函数赋值给了 函数指针 func_ptr...int (*func_ptr)(int, int) 代码 , 定义的 函数指针 有 2 个 int 类型的参数 , 有 1 个 int 类型的返回值 ; 为该函数指针 赋值 add 函数 时 , 就会自动...查找 参数列表是 2 个 int 类型的函数 , 如果没有找到 , 就会编译失败 , 如果找到了 , 为函数指针赋值成功 ; 2、代码示例 - 为函数指针赋值重载函数 完整代码示例 : // 包含 C...{ return a + b + c; } int main() { // 定义 函数指针 , 将函数地址赋值给 函数指针 // 对函数指针进行赋值时 , 会根据函数指针的类型匹配 add
文章目录 一、使用 数组下标 或 指针 操作字符串 1、使用 数组下标 操作字符串 2、使用 char * 指针 操作字符串 二、代码示例 一、使用 数组下标 或 指针 操作字符串 ---- 1、使用...} 2、使用 char * 指针 操作字符串 使用 指针 访问 字符串 : 将 指针 指向数组 首地址 , 然后可以借助 指针 运算 p + i , 计算从 p 地址开始的第 i 个元素的地址 ; char...> /* * 函数入口 */ int main(int argc, char **args) { // 通过 数组下标 或 指针 操作字符串 // 定义字符数组 , 并为其赋值...5; i ++) { printf("%c\n", str[i]); } // 使用 指针 操作字符串 p = str; for(i = 0;...: a b c a b c 请按任意键继续. . .
我们暂且先不实现>的重载: 大家想一下,我们在string的使用里学过,string是不是有一个接口叫做c_str啊: 它返回的是一个指向当前string对象对应的字符数组的指针,类型为...这里返回的是const char*类型的指针,我们说cout是会自动识别类型,它这里会以字符串的形式去打印,也就是说它不是打印这个指针,而是去解引用打印它指向的字符串,遇到\0,停止,而这里返回的是空指针...还有没有什么问题? ,如果是一个对象自己给自己赋值,是不是旧出问题了啊。 怎么回事? 随机值? 因为如果是自己给自己赋值的话,_str和 s....大家看一下,我们的这个reserve有什么问题没有? ,如果我们参数n的值小于_capacity,这里是不是就真的缩容去了,重新开一块小空间,拷贝原来的数据,释放旧空间。...当然这里不能用outc_str()去打印,这个我们之前也讲了: 打印c_str返回的const char*的指针,它是遇到’\0’就停止了。所以大家可以理解成c_str就是返回C格式字符串。
领取专属 10元无门槛券
手把手带您无忧上云