c语言指针

C++类成员函数指针使用介绍

喜欢而已 提交于 2020-03-20 01:15:27
3 月,跳不动了?>>> 前言 在之前写过的博客中有介绍过函数指针和指针函数的区别和简单用法(文章在这里),当时的Demo非常简单,都是C语言的写法,但是当在C++中直接像C那样使用类成员函数指针时就会报错:reference to non-static member function must be called 所以如果是C++中的成员函数指针其使用方法是有区别的,这里针对不同的场景做个补充说明。 类成员函数的指针(非静态) 指向类成员函数的指针与普通函数指针的区别在于,前者需要匹配函数的参数类型和个数以及返回值类型,还要匹配该函数指针所属的类类型。 这是因为非静态的成员函数必须被绑定到一个类的对象或者指针上,才能得到被调用对象的this指针,然后才能调用指针所指的成员函数(所有类的对象都有自己数据成员的拷贝,但是成员函数都是共用的,为了区分是谁调用了成员函数,就必须有this指针,this指针是隐式的添加到函数参数列表里去的)。 所以,对于类成员函数的指针使用包含以下几个步骤: 声明: 指向类的成员函数的指针需要在指针前面加上类的类型,格式为: typedef 返回值 (类名::*指针类型名)(参数列表); 赋值: 需要用类的成员函数地址赋值,格式为: 指针类型名 指针名 = &类名::成员函数名; 1 注意:这里的这个&符号是比较重要的:不加&

C语言总结2

廉价感情. 提交于 2020-03-19 08:42:36
12).预处理指令 1. 什么叫做预处理代码. 以#开头的代码就是预处理代码 #warning #import 2. 手写1个C程序的步骤.(面试题) 1>编写代码 2>编译 1)执行.c中的预处理代码 2)检查语法 3>链接 4>执行 3. 预处理指令的分类.(面试题) ****** 1>文件包含指令 #include 2>宏定义 #define (用来替换代码) 3>条件编译 #if (满足一定的条件才编译) 4. 预处理指令的特点. 1>都是以#开头 2>后面没有分号 3>在编译的时候,检查语法之前进行 "注意 以#开头的代码就是预处理代码 13).sizeof运算符 sizeof运算符的作用? 作用:计算常量,变量在当前系统上内存中所占的字节数 sizeof (数据类型) sizeof (变量)-----用的最多! sizeof (常量) 注意, char类型的变量在内存中占1个字节; char类型的常量在内存中占4个字节; 综上所述,为了安全起见,sizeof后面最好加上括号! 14).按位异或 ^ 异或运算 不同为1,相同为0 注意: 1 相同整数相^的结果是0; 2 一个整数^另一个整数2次结果不变 ; 3^2^2 = 3 3 整数相^跟顺序无关 3^2^3 = 2^3^3 = 2 15). 按位左移或者右移 1,按位左移运算. << 参与按位左移运算的二进制数据.

指针系统学习2

故事扮演 提交于 2020-03-19 08:42:14
1.数组与指针   一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。   指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。   所谓数组元素的指针就是数组元素的地址。 2.指向数组元素的指针   定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。   例如:   int a[10];(定义a为包含10个整型数据的数组)   int *p; (定义p为指向整型变量的指针变量)。   应当注意,如果数组为int型,则指针变量的基类型亦应为int型。 3.下面是对该指针变量赋值:   p = &a[0];把a[0]元素的地址赋给指针变量p。 也就是使p指向a数组的第0号元素,见图 -->> 4.通过指针引用数组元素:   引用一个数组元素,可以用:   (1) 下标法,如 a[i] 形式;   (2) 指针法,如*(a+i)或*(p+i)。   其中的a是数组名,p是指向数组元素的指针变量,其初值 p=a。   注意:数组名即“翻译成数组的第一个元素的地址! 例题: 输出数组中的全部元素 假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法: (1) 下标法 #include <stdio.h> void main() { int a[10]; int i; for(

2019 第六周作业

不想你离开。 提交于 2020-03-18 14:41:17
2019春季第六周作业 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 ( https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888 ) 我在这个课程的目标是 理解变量、内存单元和地址之间的关系,掌握指针变量的基本运算 这个作业在哪个具体方面帮助我实现目标 这个作业让我大概了解了指针的定义及用法 参考文献 ( https://jingyan.baidu.com/article/20095761754006cb0721b4bb.html ) 一、基础题 1、求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double *a, double *b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: #include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b

IOS笔记-C语言中的字符串数组 指针

南楼画角 提交于 2020-03-16 21:46:09
1、字符串 用“”引起来的内容,就是字符串。 在C语言中有没有专门的字符串的变量? 没有 所以我们使用字符数组来存储字符串。(把字符串的每一个字符存储到字符数组的每一个元素中,并且会多存放一个‘\0’) '\0' 字符串的结束标记,ascII码表中值是 0 对应的字符。NUT,NULL 2、字符数组 1)定义 char 数祖名[长度]; char str[200]; 表示定义一个长度为200的字符数组,如果用来存储字符串,则字符串的最大长度是199,留出一个给'\0' char str[3]={'a','b','c'}; //不能以%s进行输出 2)初始化 (1)完全初始化 char str[3]={'a','b','c'}; (2)部分初始化 char str[3]={'a','b'}; (3)用字符串进行初始化 char str[10]="itcast"; //占用了7个字节因为'\0'占用了一个 char str[10]={"itcast"}; 3)字符数组的引用 如果把字符数组的内容逐个取出,str[0]、str[1]....str[n-1]; %s 字符串的格式控制符把字符数组整体进行输出 %s 给一个字符数组的首地址,系统会自动从首地址开始连续读取直到遇到'\0'结束 4)存储细节 字符数组存储的细节: 连续的一片存储区域(地址是连续的),每个字符占用1个字节

C和指针

眉间皱痕 提交于 2020-03-16 20:23:01
1.指针数据类型 变量的值存储于计算机的内存中,每个变量占据一个特定的位置,每个内存位置都由地址唯一确定并引用。指针只是 地址的另一个名字罢了。指针变量就是一个其值为另一个内存地址的变量。 1.1 指针常量 指针常量与非指针常量在本质上是不同的,因为编译器负责把变量赋值给计算机内存中的位置,程序员事先无法知道某个特定的变量将存储到内存的哪个位置。因此,你通过操作符获得一个变量的地址而不是直接把它的地址写成字面值常量的形式。事实上,当一个函数每次被调用时,它的自动变量(局部变量)可能每次分配的 内存位置都不相同,因此把指针常量表达为数值字面值的形式几乎没有用处,所以C语言内部没有特地定义这个概念。 1.2 static关键字 当用于不同的上下文环境时,static关键字具有不同的意思。 当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal。但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件内访问。 当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁。 来源:

c语言第三次作业

萝らか妹 提交于 2020-03-16 09:00:30
观看视频1.2.2,1.3.1,1.3.2 1、视频笔记 2、编写程序代码列表 3、存在的问题: (1)分不清scanf函数与gets函数的区别 解决方法:通过查阅课本,明白scanf函数不能读入空格或Tab,而gets函数可以。 (2).判断:语句 int *p 和 printf("%d",*p); 中的*p含义相同。(F) 解析:前者表示指针变量,后者表示指针变量储存的地址。 来源: https://www.cnblogs.com/jhy12/p/12501725.html

container_of宏剖析

我的未来我决定 提交于 2020-03-16 06:45:14
container_of宏剖析 //该宏位于include/linux/kernel.h 1.定义格式 /** * container_of - cast a member of a structure out to the containing structure * * @ptr: the pointer to the member. * @type: the type of the container struct this is embedded in. * @member:the name of the member within the struct. * */ #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) 作用:就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。 例: struct demo_struct { type1 member1; type2 member2; type3 member3; } struct demo_struct demo1,*pdemo; type2 *

C语言字符串中的指针与数组

≡放荡痞女 提交于 2020-03-15 21:52:56
先说一下字符串字面量(字符串常量):双引号中的字符和编译器自动加入末尾的\0字符,都作为字符串储存在内存中。字符串常量属于静态存储类别,说明如果在函数中使用字符串常量,该字符串只会储存一次,在整个程序的生命周期内存在,即使函数被调用多次。用双引号扣起来的内容被视为指向该字符串储存位置的指针。 字符串的赋值可以用指针与数组,请看下面的例子 char str1[] = "I am a student"; const char *str2 = "I am a student too"; 以上两种表示方法还是有一些不同的 先说数组表示法,数组形式str1[]在计算机的内存中分配一个内含15个元素的数组(末尾还要加上空字符'\0'),当程序载入内存时,也载入了程序中的字符串,字符串存储在静态存储区中,但是当程序在开始时才会为该数组分配内存,此时才将字符串拷贝到数组中,注意此时字符串有两个副本,一个是静态存储区中的常量,另一个是存储在数组中的字符串。str1为首元素的地址(&str1[0]),是常量地址,不能更改,可以进行str1+1(&str1[1]),但是不允许str++这样的操作,因为递增运算符只能对变量名进行运算。 指针形式(*str2)也使得编译器为字符串在静态存储区预留19个元素空间,一旦开始执行程序,它会为指针变量str2流出一个储存位置,并把字符串的地址储存在指针变量中

嵌入式开发之C基础学习笔记06--数组和指针(非常重要,难点)

非 Y 不嫁゛ 提交于 2020-03-15 21:50:14
C语言进阶学习 数组 1)数组的使用 2)字符串(String):数组(尤其是一维数组)最常用的地方——————>C语言中字符串就是一维数组 数组: 定义:具有相同类型的数据的有序集合,并用唯一的名字来标识。 1)数组必须直接声明,编译器在编译阶段为其分配内存空间 2)C89数组必须是定长的,数组的大小在编译时是固定的;C99允许使用变长数组,数组的大小在运行时确定 void f(int longeur,int wide) { int matrix[longeur][wide];/*定义一个矩阵*/ /*数组的长度由两个参数决定*/ } 3)数组的所有元素占连续的内存空间,在内存中是线性(顺序)存放的,保存数组所需要的内存空间直接与基本类型和数组长度有关。 数组占用的内存空间 = sizeof(基类型)*数组长度 4)C不检查数组是否越界,程序可以在两边越界。程序员应自己加入越界检查。数组可以越界使用,但是初始化时不允许! 5)向函数传递数组: 定义数组形参的方法有三种:指针,定长数组,无尺寸数组 void func1(int *a){...} void func2(int a[10]){...} void func3(int a[]){...} 在函数的形参的声明中,数组尺寸无所谓,因为C语言没有边界检查 实际上,第二种方法在编译后,编译器产生的代码就是让函数接受指针