指针

C语言函数指针的用法

丶灬走出姿态 提交于 2020-01-31 06:01:28
这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址: http://www.cnblogs.com/archimedes/p/function-pointer-in-c-struct.html ,转载请注明源地址。 引言 指针是C语言的重要组成部分, 于是深入理解指针并且高效地使用指针可以使程序员写出更加老练的程序。我们要记住指针是一个指向内存地址的变量。指针可以引用如int、char……常见的数据类型,例如: int * intptr; // 声明一个指向整型值的指针 int intval = 5 ; // 定义一个整型变量 intptr = & intval ; // intptr现在包含intval的地址 指针不仅仅指向常规的类型还可以指向函数 函数指针 函数指针的内容不难理解,不再赘述,参见《 C语言函数指针的用法 》 语法 要声明一个函数指针,使用下面的语法: Return Type ( * function pointer's variable name ) ( parameters ) 例如声明一个名为func的函数指针,接收两个整型参数并且返回一个整型值 int (*func)(int a , int b ) ; 可以方便的使用类型定义运用于函数指针: typedef int (*func)(int a , int b ) ;

c++:智能指针shared_ptr

好久不见. 提交于 2020-01-31 05:44:54
先前的文章我们讲过了智能指针的概念等一系列问题,下面我们直接来看智能指针 1.带有引用计数的智能指针 (Shared_ptr)同时也是强智能指针 所谓的引用计数,就是有多少个智能指针对象管理这个堆内存。引用计数的作用是做所有对象共享的。 不可以写为普通的成员变量,要写成静态的成员变量 我们用一个引用计数管理器来实现Shared_ptr智能指针: 设计思路: 将引用计数管理器设计为数组,用地址和引用计数来当作节点记录堆内存,因为对地址只做一个简单的计数管理,所以用void*,引用计数用int,在智能指针类中,给出一个私有的成员变量mptr,一个静态的成员变量(引用计数管理器)static RefManage。给定一个对象rm。 但智能指针与引用计数管理器属于两种不同的类,为了实现它们之间的信息交互就要调用对方的接口。在引用计数管理器中预留一些接口(下面会给出接口的类型),注意堆上的操作都在智能指针类,通过下面的几个接口可以来进行对 智能指针类的操作,智能指针类中成员变量,静态变量已经设置好。智能指针类构造函数中,引用计数初值都是零,现在 添加 一个引用计数,现在生成一个sp1对象,要调用构造函数对sp1进行初始化,将mptr传给地址域,mptr地址为0x100,通过 getRef()接口传递到引用计数管理器类中,要将0x100与地址域中的数据做比较,如查到与0x100相等的数据

Data Structure ---SinglyLinkedList

喜你入骨 提交于 2020-01-31 05:44:03
# include <stdio.h> # include <stdlib.h> //exit的头文件 # define OVERFLOW -2 # define OK 1 # define ERROR 0 # define TRUE 1 # define FALSE 0 typedef int ElemType ; typedef struct LNode { ElemType data ; struct LNode * next ; } LNode ; typedef struct LNode * LinkList ; typedef int Status ; //在调用函数前指针为空,在函数中为指针分配了新结点,而不是原来的结点,此时只能采用&引用或者指向指针的形式,LinkList &L,LinkList *L; //在调用函数前指针不为空,在函数中对结点进行插入和删除操作,则可以采用引用传递或者指针传递,LinkList &L,LinkList L; Status InitList ( LinkList * L ) //这里传递的参数是LinkList *L,是双重指针,应该理解为指向指针的指针,而不是理解为结点LNode,把指针的地址传过来了,对*L进行修改的话,也就对地址中的内容做了修改,也就对传进来的参数做了修改;这个地方不是LinkList L

(超级棒)多级指针的使用【指针的总结②】

旧巷老猫 提交于 2020-01-31 04:10:15
(超级棒)C++基础·笔记——多级指针的使用【指针的总结②】 ~QQ:3020889729 ~小蔡 一级指针的复习 声明方式 一级指针的理解 二级指针的理解 声明方式 二级指针的认识(理解) 二级指针的操作 多级指针的拓展 总结 指针的个人理解:(打个比方,去指定的位置取东西) ~QQ:3020889729 ~小蔡 一级指针的复习 声明方式 方式: 数据类型* 变量名 = 地址 ; (Example:int* p = &a;) #include "iostream" using namespace std; int main() { int a = 0;//初始化为0 int* p = &a;//指针声明,务必初始化地址 //也可以这样:int* p = NULL; p = &a; *p = 8;//修改地址上的数据 cout << "a = " << a << endl;//输出此时a的值 cout << "*p = " << *p << endl;//输出指针p的值 return 0; } 一级指针的理解 一级指针可以理解是 某一个地址的操作符 ——可以对该地址上的内容(数据)进行修改。 二级指针的理解 声明方式 方式:数据类型** 变量名 = 指针的地址/地址的地址;(Example:int* q = &a; int** p = &q; ) #include

蘑菇街总结

一个人想着一个人 提交于 2020-01-31 02:48:07
1、如果有一个bug,出现的概率是一百分之一 问:怎么调试解决这个bug 2、Java在什么情况下会出现内存泄露 3、内存泄露怎么调试 4、说一说C++11的新特性 5、http和tcp的区别,: TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据 6、问指针和引用区别: 首先,引用不可以为空,但指针可以为空。前面也说过了引用是对象的别名,引用为空——对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化。因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针;如果变量总是指向一个对象,i.e.,你的设计不允许变量为空,这时你应该使用引用。如下图中,如果定义一个引用变量,不初始化的话连编译都通不过(编译时错误 而声明指针是可以不指向任何对象,也正是因为这个原因,使用指针之前必须做判空操作,而引用就不必。 其次,引用不可以改变指向,对一个对象"至死不渝";但是指针可以改变指向,而指向其它对象。说明:虽然引用不可以改变指向,但是可以改变初始化对象的内容。例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容 7、问linux下文件系统删除一个文件,问CLOSE_WAIT和TIME_WAIT的区别,感觉这些很钻牛角尖 (1

C博客作业--指针

跟風遠走 提交于 2020-01-31 02:08:53
一、PTA实验作业 题目1:6-9 求子串在母串中最后一次出现的地址 1. 本题PTA提交列表 2. 设计思路 定义i,j存放循环变量,n存放子串长度 定义指针p存放子串最后一次出现的地址 for i=0 to t[i]=0 令n=i for i=0 to s[i]=0 for j=0 to t[j]=s[i] 如果t[j+1]=0,p=s[i-n+1]的地址,即子串第一个字符在母串地址 并flag=1表示程序进过这个循环 如果flag=0,p=NULL 返回p 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明 本题无误 题目2:6-8 使用函数实现字符串部分复制 1. 本题PTA提交列表 2.设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明 部分错误:在想问题时,对数组下标的把握错误,导致失误 题目3:6-11 报数 1. 本题PTA提交列表 2. 设计思路 ``` 定义变量i,k存放总人数,l存放排位数 定义数组a[100] for i=1 to i>=n a[i]=i(让数组每个元素等于他的下标) end for i=1 to n=0 若i>k,i=i-k(将i转化为小于总人数的数字) 若a[i-1]=-1 l--,跳过下面步骤 若l是m的倍数,out[i-1]=j;j++;a[i-1]=-1(将该数组标记为已退出);n--; end ·

const int *p;int *const p;int const *p;const int *const a;

爱⌒轻易说出口 提交于 2020-01-31 01:34:22
const int *p;和int const *p; 二者是一样的,其中const 修饰的是int,表示指针所指的对象不可以通过该指针被改变(但是不代表这个对象不可以通过其他途径改变),但是指针本身可以被改变。 eg: #include<bits/stdc++.h> using namespace std; int a=1; int b=2; int const *x=&a; const int *y=&a; int main(){ //指针所指的对象可以从a指向b x=&b; y=&b; /* 编译错误,指针所指对象的值不可以被改变。 *x=10; *y=10; */ b=3;a=4; cout<<*x<<" "<<*y<<" "<<a<<" "<<b<<endl; //输出3 3 4 3 //从这里看出,虽然无法通过指针修改对象,但是对象的值还是可以改变。 } int *const p; 表示可以通过该指针修改所指的对象的值,但是指针本身不能改变。 eg: #include<bits/stdc++.h> using namespace std; int a=10; int b=5; int *const p=&a; int main(){ *p=0; //p=&b; 错误,指针不可以被改变 cout<<a<<" "<<b<<" "<<*p<<endl; //输出0 5 0 }

C博客作业--指针

跟風遠走 提交于 2020-01-31 01:15:57
一、PTA实验作业 题目1:题目名称6-6 输出月份英文名 1. 本题PTA提交列表 2. 设计思路 switch(n) 如果n为1,返回"January"; 如果n为2,返回"February"; 如果n为3,返回 "March"; 如果n为4,返回 "April"; 如果n为5,返回 "May"; 如果n为6,返回 "June"; 如果n为7,返回"July"; 如果n为8,返回"August"; 如果n为9,返回 "September"; 如果n为10,返回 "October"; 如果n为11,返回 "November"; 如果n为12,返回 "December"; 否则返回 NULL; 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明 这道题没有问题。 题目2:6-8 使用函数实现字符串部分复制 1. 本题PTA提交列表 2. 设计思路 * 定义变量i为0 * gets(s) * t从t+m-1开始直到*t,t++ s[i++]等于*t; end * s[i]等于0 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明 本题没有问题 题目3:6-11 报数 1. 本题PTA提交列表 2. 设计思路 定义变量i,j,s,count与数组a[10001] i从0开始,直到i小于n,i++ 将i+1赋予a for用于外层循环 i从0开始直到i小于n;i++

看 C++ Primer 的58页, 讲拷贝时不能忽略 底层const这里的说的原因有点牵强, 这里给出自己的理解

浪尽此生 提交于 2020-01-31 00:55:23
extern const int ci =42; const int * p2 = &ci; extern const int *const p3= p2;   int *p= p3;      //错,p没有底层const。 书上的解释是: p3是顶层const 也是底层const,拷贝p3可以不在乎其顶层const, 但是p3指向的是一个常量,因此不能用P3初始化p, 而p 只能指向非常量。 理解他说的意思是因为一个指向常量一个指向非常量。 但自己仔细想想, 底层const也可以指向一个非常量, 那是不是当p3一开始就用非常量初始化时,此时p3和p 都指向非常量了, int *p= p3; 是不是就正确了呢? 如果按书上的解释,给人的误解是当他俩都指向常量或非常量时就没问题了, 这是误解,产生误解是因为他没说清楚。   我是这么理解: 指向常量的指针既可以指向常量 也可以指向非常量, 而一般普通指针只能指向非常量。 1、假设 不同时具有底层const也可以拷贝: 当有底层const的指针给 没有底层const的指针赋值时, 因为 前者 可以指向常量或非常量, 后者只能指向非常量, 所以前者无关紧要。感觉没啥不对的。 现在反过来: 当没有底层const的指针 给 有底层const的指针 赋值时, 因为前者 只能指向非常量, 后者可以指向常量或非常量,问题来了: 当后者指向非常量

c primer plus 第10章 数组和指针 笔记要点

五迷三道 提交于 2020-01-31 00:44:34
使用const前缀声明数组,可以把数组设置为只读,以便保护数据。 例如: const int powers[3] = {1,2,4}; int sum( const int ar[] , int n); 初始化数组时可以省略方括号里的数字,编译器会根据初始化列表中的项数来确定数组大小。 int powers [] = {1,2,4}; 通过 sizeof days/ sizeof days[0] 可得元素个数 C99 可以初始化指定的数组元素: int arr[6] { [5] = 212 } 使用指针形参 int sump(* int start , * int end ) { {…} while(start < end) {…} } 使用指针时,尽量在声明时进行 初始化 ,防止出现 int *pt; *pt = 5; C99 变长数组(VLA)使用变量表示数组的维度: int q = 4 ; int r = 5; double sales [q][r] ; 声明: 仅用作个人复习 源自博客 一只大鸽子 原文链接:https://blog.csdn.net/qq_41068877/article/details/88163850 来源: CSDN 作者: Chilliming 链接: https://blog.csdn.net/qq_39994598/article