精华内容
下载资源
问答
  • 结构体拷贝 先声明一个狗狗的结构体 type Dog struct { name string age int8 } // 重写String接口 func (Dog *Dog) String()...可以看到输出的时候并没有用到重写的String方法(毕竟不是指针) func main() { d1 := D

    结构体拷贝

    先声明一个狗狗的结构体

    type Dog struct {
    	name  string
    	age   int8
    }
    // 重写String接口
    func (Dog *Dog) String() string {
    	return fmt.Sprintf("this dog's name: %s, it's age: %d",Dog.name,Dog.age)
    }
    

    1.普通声明及值拷贝

    可以看到输出的时候并没有用到重写的String方法(毕竟不是指针)

    func main() {
    	d1 := Dog{"豆豆", 2}
    	d2 := d1 //值拷贝
    	d1.name = "小喵"
    	fmt.Println(d1) // {小喵 2}
    	fmt.Println(d2) // {豆豆 2}
    }
    

    2.普通声明及指针浅拷贝

    可以看到输出的时候d1和d3的值是一样的,但是d1没有用到String,d3有

    func main() {
    	d1 := Dog{"豆豆", 2}
    	d3 := &d1 //值拷贝
    	d1.name = "小喵"
    	fmt.Println(d1) // {小喵 2}
    	fmt.Println(d3) // this dog's name: 小喵, it's age: 2
    }
    

    3.结构体的new()声明及指针的值拷贝

    可以看到输出的时候d1和d3的值是不一样的

    func main() {
    	d1 := new(Dog) // d1指向空间1
    	d3 := new(Dog) // d3指向空间2
    	
    	d1.name = "豆豆"
    	d1.age = 2
    	
    	*d3 = *d1 // 指针的值拷贝,用*d1取出来的是"豆豆"结构体,赋值给*d3,那么d3指向的空间2会拷贝空间1的内容,两个空间还是独立的
    	d1.name = "小喵"
    	
    	fmt.Println(d1) // this dog's name: 小喵, it's age: 2
    	fmt.Println(d3) // this dog's name: 豆豆, it's age: 2
    }
    

    引用

    区分指针引用和值引用,使用struct的时候,明确指针引用和值引用的区别很重要。

    1.值引用赋值 比如 a:=b,这样修改a.name=“ls”,不会影响到b.name,值引用是复制结构体,开辟一块新的内存空间, a只是b的一个副本,而不是指向b的引用。

    2.指针引用赋值 比如 a:=&b ,这样修改a.name=“ls”,会影响到b.name,指针引用是指向结构体内存地址的引用,同一块内存空间
       
    总结1。值引用不会互相影响两个变量值的独立,指针引用则会互相影响,因为他们都指向同一块内存地址

    总结2:值引用只是复制的一个副本,不是指向内存地址的引用;指针引用,指针是指向内存地址的引用,因此使用它操作的不是结构体的副本而是本身。
    指针引用的时候,比如 b:=&a,此时b是指针,因此必须使用*b对其进行引用(打印值)

    展开全文
  • C++ 指针引用 *&

    千次阅读 2019-04-13 17:52:36
    文章目录指针引用的作用示例仅一级指针实现二级指针实现指针引用实现 指针引用的作用 指针引用 *& 可以 替代 二级指针 **; 使用时,更简单; 可以被重新赋值。 示例 如下示例,要求在 func( p)中,m_value值...


    指针引用的作用

    指针引用 *& 可以 替代 二级指针 **
    使用时,更简单;
    可以被重新赋值。


    示例

    如下示例,要求在 func( p)中,m_value值和 参数 p 指代的实际内容值相同;
    且之后 m_value值的改变,会影响 p 的实际内容;

    仅一级指针实现

    #include <iostream>
    using namespace std;
    
    int m_value = 1;
    
    //一级指针参数
    void func(int * p,  int dest)
    {
    	m_value = dest;
    	*p = m_value;
    }
    
    int main(int argc, char *argv[]) {	
    	int n = 2;
    	int *pn = &n;
    	cout << *pn << endl; //初始值
    	
    	func(pn, 77);
    	cout << *pn <<endl; //经过 func 函数后
    
    	m_value = 88;
    	cout << *pn <<endl; //改变 m_value 后
    }
    

    输出:

    2
    77
    77
    

    发现 后面改变了 m_value 值 ,并不影响 *pn。 这不合要求

    二级指针实现

    #include <iostream>
    using namespace std;
    
    int m_value = 1;
    
    //二级指针参数
    void func(int ** p, int dest)
    {
    	m_value = dest;
    	*p = &m_value; //*p 表示一级指针 ,指向 m_value 内容的地址
    }
    
    int main(int argc, char *argv[]) {
    	int n = 2;
    	int *pn = &n;
    	cout << *pn << endl; //初始值
    	
    	func(&pn, 77); //pn 是指针变量, &pn 就是二级指针
    	cout << *pn <<endl; //经过 func 函数后
    	
    	m_value = 88;
    	cout << *pn <<endl; //改变 m_value 后
    }
    
    

    输出:

    2
    77
    88
    

    满足要求。

    指针引用实现

    #include <iostream>
    using namespace std;
    
    int m_value = 1;
    
    //指针引用参数
    void func(int *& p, int dest)
    {
    	m_value = dest;
    	p = &m_value;
    }
    
    int main(int argc, char *argv[]) {
    	int n = 2;
    	int *pn = &n;
    	cout << *pn << endl; //初始值
    	
    	func(pn, 77); //传递一级指针
    	cout << *pn <<endl; //经过 func 函数后
    	
    	m_value = 88;
    	cout << *pn <<endl; //改变 m_value 后
    }
    
    

    输出:

    2
    77
    88
    

    满足要求。


    一级指针改变地址(2020.01.30)

    void func(const int *p, int dest)
    {
        m_value = dest;
        p = &m_value;  //直接对一级指针变量p 赋值一个地址。
    }
    
    int main(int argc, char *argv[]) {
        int n = 2;
        int *pn = &n;
        cout << *pn << endl; //初始值
    
        func(pn, 77); //传递一级指针
        cout << *pn <<endl; //经过 func 函数后
    
        m_value = 88;
        cout << *pn <<endl; //改变 m_value 后
    }
    
    

    输出

    2
    2
    2
    

    从结果看,直接改变形参一级指针地址,并不影响实参一级指针。 仅在形参所在函数内部有效。

    展开全文
  •   C语言指针基础知识点(四)–通过指针引用数组   C语言指针基础知识点(五)–用数组名作函数参数   C语言指针基础知识点(六)–通过指针引用多维数组 通过指针引用字符串 1. 字符串的引用方式 字符串是存放...

    指针系列目录

      C语言指针基础知识点(一)–指针及指针变量
      C语言指针基础知识点(二)–指针变量的引用
      C语言指针基础知识点(三)–指针变量作为函数参数
      C语言指针基础知识点(四)–通过指针引用数组
      C语言指针基础知识点(五)–用数组名作函数参数
      C语言指针基础知识点(六)–通过指针引用多维数组
      C语言指针基础知识点(七)–通过指针引用字符串
      C语言指针基础知识点(八)–返回指针值的函数
      C语言指针基础知识点(九)–指针数组和多重指针
      C语言指针基础知识点(十)–动态内存分配与指向它的指针变量

    通过指针引用字符串

    1. 字符串的引用方式

    字符串是存放在字符数组中的,引用字符串,有以下两种方法:

    (1).通过数组名和下标

    #include <stdio.h>
    
    int main()
    {
    	char string[]="I love china!";
    	printf("%s\n",string);
    	printf("%c\n",string[7]);
    	return 0;
    }
    

    在这里插入图片描述
    (2).通过字符指针变量引用一个字符串常量

    #include <stdio.h>
    
    int main()
    {
    	char *string="I love china!";   // 把字符串的第1个元素的地址赋给字符指针变量 string
    	printf("%s\n",string);
    	return 0;
    }
    

    在这里插入图片描述


    栗子1:

    将字符串a赋值给字符串b,然后输出字符串b

    方法1: 字符数组

    #include <stdio.h>
    
    int main()
    {
    	char a[]="I love china!", b[20];
    	int i;
    	for(i=0;*(a+i)!='\0';i++)
    		*(b+i)=*(a+i);
    	*(b+i)='\0';
    
    	printf("string a is:%s\n", a);
    	printf("string b is:%s\n", b);
    
    	printf("string b is:");
    	for(i=0;b[i]!='\0';i++)
    		printf("%c",b[i]);
    
    	printf("\n");
    
    	return 0;
    }
    

    在这里插入图片描述
    方法2:指针变量

    #include <stdio.h>
    
    int main()
    {
    	char a[]="I love china!", b[20], *p1, *p2;
    	p1=a; 
    	p2=b;
    	for(;*p1!='\0';p1++,p2++)
    		*p2=*p1;
    	*p2='\0';
    	
    	printf("string a is:%s\n", a);
    	printf("string b is:%s\n", b);
    
    	return 0;
    }
    

    在这里插入图片描述
    2. 字符指针作函数参数

    函数的形参和实参分别用字符数组名或字符指针变量

    #include <stdio.h>
    
    int main()
    {
    	void copy_string(char from[], char to[]);
    	char a[]="I love china!";
    	char b[]="You are a teacher!";
    
    	printf("string a=%s\nstring b=%s\n",a,b);
    	printf("copy string a to string b:\n");
    
    	copy_string(a,b);
    
    	printf("string a=%s\nstring b=%s\n",a,b);
    
    	return 0;
    
    }
    
    void copy_string(char from[], char to[])
    {
    	int i = 0;
    	while(from[i]!='\0')
    		{
    			to[i]=from[i];
    			i++;
    		}	
    	to[i]='\0';		
    }
    

    在这里插入图片描述

    3. 字符指针变量作形参和实参

    #include <stdio.h>
    
    int main()
    {
    	void copy_string(char *from, char *to);
    	char *a="I love china!";
    	char b[]="You are a teacher!";
    
    	char *p=b;
    
    	printf("string a=%s\nstring b=%s\n",a,b);
    	printf("copy string a to string b:\n");
    
    	copy_string(a,p);
    
    	printf("string a=%s\nstring b=%s\n",a,b);
    
    	return 0;
    
    }
    
    void copy_string(char *from, char *to)
    {
    	for(;*from!='\0';from++,to++)
    		
    		{*to = *from; }
    
    	*to='\0';		
    }
    

    4. 字符指针变量和字符数组变量的比较

    展开全文
  • 该demo主要展现智能指针引用计数的实现过程,总共两个类,一个智能指针类,一个引用计数类,另外附一份执行步骤资料
  • 指针引用故障(空指针解引用)

    千次阅读 2019-01-09 18:52:45
    其中空指针引用故障,也叫空指针解引用是一类普遍存在的内存故障,是程序设计语言中一类常见的动态内存错误。指针变量可以指向堆地址、静态变量和空地址单元 。当指针指向无效内存地址时对其引用,有可能...

    C语言中的指针机制使得它灵活高效,但由于指针操作不当产生的动态内存错误也有很多,比如内存泄漏(Memory Leakage)、内存的重复释放、空指针解引用(NullPointer Dereference)

    其中空指针引用故障,也叫空指针解引用是一类普遍存在的内存故障,是程序设计语言中一类常见的动态内存错误。指针变量可以指向堆地址、静态变量和空地址单元 。当指针指向无效内存地址时对其引用,有可能产生不可预见的错误,导致软件系统崩溃。空指针引用缺陷可能导致系统崩溴、拒绝服务等诸多不良后果。

     

    展开全文
  • 通过指针引用数组

    千次阅读 2018-06-13 20:49:32
    1、指针是什么? 为了说清楚什么是指针,必须先弄清楚数据在内存中是如何存储的,又是如何读取的。 如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。编译系统根据程序中定义的...
  • ③通过指针引用数组元素 ④用数组名作函数参数 ⑤通过指针引用多维数组 ①数组元素的指针 一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址 指针变量可以指向数组元素(把某一元素的地址放...
  • C++中指针*与指针引用*&的区别说明

    千次阅读 多人点赞 2019-05-09 16:20:18
    (指针引用)与*(指针)的区别 *指针是一个存放地址的变量,指针引用指的是这个存放地址的变量的引用。 C++中如果参数不是引用的话,会调用参数对象的拷贝构造函数, 所以如果有需求想改变指针所指的对象即想要改变指针...
  • 智能指针引用计数的用法

    千次阅读 2018-04-19 23:27:56
    对智能指针的用法,大多数人都清楚调用一次拷贝/赋值构造函数,引用计数器就加1,退出作用域引用计数器减1,直到引用计数器的值为0时,才进行资源的释放。但在项目开发中,对定义的智能指针退出作用域后,到底有没有...
  • Golang struct 指针引用用法 一、前言 入门篇,只包括声明内容,基础的赋值 和 修改值。 个人总结:在 变量访问 struct 结构体时,共有5种不同的方式定义 指针结构体。 个人术语: 结构体内:struct 具体的变量实例...
  • 2、指针引用传参被调用函数的指针变量与调用函数的指针变量共用一块空间。 // PointerCite.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; ...
  • 通过指针引用数组元素

    千次阅读 2017-05-23 17:18:36
    通过指针应用数组元素: (1)下标法,如a[i]形式; (2)指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初值p=a; 例如:有一个整数数组a,有10个元素,要求输出数组中的全部元素。 ...
  • 二级指针和指针引用函数传参(C++)

    万次阅读 多人点赞 2016-10-23 13:18:18
    在函数的使用过程中,我们都明白传值和传引用会使实参的值发生改变。那么能够通过传指针改变指针所指向的地址吗?在解决这个问题之前,也许我们应该先了解指针非常容易混淆的三个属性: ①.指针变量地址(&p) ...
  • 指针引用最大的区别,指针是开辟了一块内存空间,实实在在存在的,寻得到,而引用是给原有的内存空间起一个别名。对计算机来说变量只不过是一堆地址和该地址的值。 先来看没有函数的写法 #include<stdio.h> ...
  • 1.数组指针:即指向数组的指针 ...2.通过指针引用数组元素的基本方法 (1)小标法:a[i]。 (2)指针法:* (a+i) 或 * (p+i) 或 p[i]。其中,a是数组名,p=a,p是指向数组元素的指针变量。 问:为什么*
  • C语言指针引用二维数组

    千次阅读 2016-12-07 16:53:11
    不用取地址符和指针 1.二维数组的元素: a[0][1] 2.二维数组的地址: 2.1 0行首地址:a 2.2 1行0列元素地址:a[1] 2.3 1行首地址 : a+1 二.用取地址符(当然只能表示数组的地址) 1.0行首地址:&a[0] 2....
  • 指针引用总结

    千次阅读 多人点赞 2018-10-15 22:58:07
    指针 若现在指针不知道指向,可以使用NULL,例如int *b = NULL; char *a = NULL;,但是使用的时候若指针指向的是数组或者字符串等,需要提前声明大小。若是int *,则不需要,直接将一个int类型的指针赋值给它即可。 ...
  • 指针引用二维数组元素

    千次阅读 2017-05-07 20:00:25
    首先定义一个二维数组  int a[3][2]; 关于 a *a **a 做出以下理解: ... 数组名a为数组首元素的地址 即 ...下面给出具体用指针输出a[3][2]各个元素的程序: 运行结果为:
  • swap()交换函数【引用】【指针】【指针引用

    千次阅读 多人点赞 2020-10-23 15:47:02
    swap()交换函数【引用】【指针】【指针引用】 涉及基础知识 C语言的变量,就是将系统分配的地址取个别名,所以变量名就是地址。 引用是一个变量的另一个名字,又称别名。 定义方式: int a=10; int &b=a; ...
  • 5、指针引用传参第一类,仅会改变指针指向的地址(即改变指针的内容),而使得指针指向的值出现非法现象 5.1:指针传参方法 //可改变指针所指向的地址 void ChangePtrAddress(int* &p) { printf("分配内存前p的...
  • 指针引用作参数和指针做参数的区别???? 2012-10-24 17:17dingba12345 | 浏览 1626 次  网络 void f(int *p)和void f(int *&rp)有什么区别? 我知道rp不占内存空间,只是实参的别名,对rp的改变就是...
  • C++ 指针引用和指向引用指针

    万次阅读 多人点赞 2019-02-06 18:31:49
    指向引用指针 使用指针的一个简单例子就是: int v = 1; int *p = &amp;v; 需要预先强调的是没有指向引用指针!因为引用不是对象,没有地址。但是指向引用指针是什么形式呢? 是对一个引用进行如下取地址...
  • 文章目录1 C++ 值传递、指针传递、引用传递详解值传递:指针传递:引用传递:2 数组作为函数的形参2.1 一维数组传递2.2 二维数组传递总结 1 C++ 值传递、指针传递、引用传递详解 值传递: 形参是实参的拷贝,改变...
  • 指针有时候真的不是很好懂下面下面我将利用调试的方式讲解一下指针到底是个什么东西 这里我使用了链表结构题 指针传递传递 这张图片我们可以看出head指针的地址与head指针所指向的内容的地址也就是值的地址如下图...
  • 下面通过例题说明,如何引用结构体指针变量存储结构体变量地址,以及如何通过结构体指针变量间接的引用结构体变量以及其成员变量。 例9-3 应用结构体指针变量,打印结构体成员变量的信息。 #include ...
  • 如果我们想通过指向结构体变量的指针引用结构体变量中的成员,可采取三种方式: 1.结果变量名.成员名 2.(*指针名).成员名 3.指针名->成员名 举例:有一个结构体student,结构体变量stu,结构体指针p, ...
  • 父类与子类之间 指针引用等互调

    千次阅读 2015-08-25 16:44:45
    一、 指针调用情况  1、 父类指针new子类对象,而不能为子类指针new父类对象  因为子类包含有父类,把子指针赋给父指针时其实只是把子类中父类部分的地址赋给了父类指针而已,而父类里没有包含子类,所以不能...
  • 指针引用的区别

    万次阅读 多人点赞 2018-06-04 12:05:05
    指针引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作。但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针引用,力争将最真实的一面...
  • rust指针引用、智能指针

    千次阅读 2020-06-15 15:49:19
    文章目录指针引用可变引用不可变引用悬垂引用引用&借用解引用智能指针 指针 指针是个通用概念,它表示内存地址这种类型,其引用或“指向”其他数据。Rust中的指针是“第一类公民”(first-class values),可以...
  • 1.指针引用的区别:   指针是一块内存的地址值,而引用是一块内存的别名。 下面引自:http://www.cnblogs.com/kingln/articles/1129114.html 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 658,781
精华内容 263,512
关键字:

指针的引用