指针

二维数组和二维指针作为函数的参数

江枫思渺然 提交于 2020-01-07 18:09:37
不管是在工作上,还是最近在LeetCode上刷题。都错误的认为 二维数组 和 二维指针作为函数的参数时是等价的。这种认知是错误的。究其原因,还是对数组和指针理解的不深入。今天把我的理解做一个总结: 假如一个函数的形参是一个二维指针,但是你实参传入的是一个二维数组。那么你就会编译报错。 为什么我会错误的认为二维数组作为函数参数的时候等价于二维指针呢? 我思考了我为什么会这么想的原因了:一维数组作为函数参数的时候,编译器会把数组名当作指向该数组第一个元素的指针。所以我想当然的以为:既然一维数组和一维指针在函数参数中等价,那二维数组应该就等价于二维指针啊。 但是很遗憾,二维数组作为函数参数并等价于二维指针。因为 数组作为函数参数时转换为指针没有传递性 。也就是说你不能认为一维数组和一维指针作为函数参数等价,就认为二维数组和二维指针就等价了。在C语言中没有这样的传递性。 其实仔细想想,也是很容易明白的。二维数组其实就是一个数组的数组(即它是一个一维数组,只不过它的每个元素又都是一个一维数组)。当二维数组作为函数入参时,比如 int a[3][4]; 它的第一维数组会被转换成指针,相当于是传入了一个指向数组的指针。即作为函数参数, int a[3][4]和 int (*p)[4]等价。那 int (*p)[4]和 int **pp等价吗?肯定不等价呀, p指针指向类型是 int [4]

链表的基本操作

懵懂的女人 提交于 2020-01-07 17:38:37
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> package com.lifeibigdata.algorithms.linearlist; /** * Created by lifei on 16/5/26. */ import java.util.HashMap; import java.util.Stack; /** * http://blog.csdn.net/luckyxiaoqiang/article/details/7393134 轻松搞定面试中的链表题目 * http://www.cnblogs.com/jax/archive/2009/12/11/1621504.html 算法大全(1)单链表 * * 目录: * 1. 求单链表中结点的个数: getListLength * 2. 将单链表反转: reverseList(遍历),reverseListRec(递归) * 3. 查找单链表中的倒数第K个结点(k > 0): reGetKthNode * 4. 查找单链表的中间结点: getMiddleNode * 5. 从尾到头打印单链表: reversePrintListStack,reversePrintListRec(递归) * 6. 已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序:

同向双指针算法题总结

梦想的初衷 提交于 2020-01-07 14:41:11
同向双指针是经常考的一种题型; 什么时候用? 发现题目,两个指针,只要固定一个,另外一个扫描,总是有坏坏坏,突然变好,不再回来 或者好好好,忽然变坏,不再回来,那么就是同向双指针算法,基本上都是O(n)的算法复杂度; 写程序注意的点: 固定i,i是 主指针每次走一步,写for循环 ,j是 辅指针,写while循环,每次可能走N步 ; Minimum Size Subarray Sum 给定一个由 n 个正整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组。如果无解,则返回 -1。 Example 样例 1: 输入: [2,3,1,2,4,3], s = 7 输出: 2 解释: 子数组 [4,3] 是该条件下的最小长度子数组。 样例 2: 输入: [1, 2, 3, 4, 5], s = 100 输出: -1 思路:主指针i每次走一步,j每次走N步,i用for,j用while循环;每次用j滑动到找到>=s的地方,更新 length,i++ 同时sum - nums[i]; public class Solution { /** * @param nums: an array of integers * @param s: An integer * @return: an integer representing the minimum size of

关于指针

天涯浪子 提交于 2020-01-07 12:38:35
关于指针的概念,错误的是:( ) A. 指针是变量,用来存放地址 B. 指针变量中存的有效地址可以唯一指向内存中的一块区域 C. 野指针也可以正常使用 D. 局部指针变量不初始化就是野指针 AC 以下系统中,int类型占几个字节,指针占几个字节,操作系统可以使用的最大内存空间是多大:( ) A.32位下:4,4,2^32 64位下:8,8,2^64 B.32位下:4,4,不限制 64位下:4,8,不限制 C.32位下:4,4,2^32 64位下:4,8,2^64 D.32位下:4,4,2^32 64位下:4,4,2^64 C 写一个函数打印arr数组的内容,不使用数组下标,使用指针。 #include<stdio.h> #include<stdlib.h> int main(void){ int arr[] = {1,2,3,4,5,6,7,8,9,10}; int i; int *p; p = arr; for(i = 0;i<10;i++) { printf("%d",*(p+i)); } system("pause"); return 0; } 下面代码输出的结果是:( ) #include <stdio.h> int main() { int a = 0x11223344; char pc = (char )&a; *pc = 0; printf("%x\n", a);

对指针运算符*文字说明的一点点理解

一笑奈何 提交于 2020-01-07 08:56:22
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 指针运算符称之为间接运算符还称之为取消引用运算符. 间接运算符*可以访问指针所指的变量值(这个文字解释好理解)。 这个运算符也称为取消引用运算符,因为它用于取消对指针的引用。 ”因为它用于取消对指针的引用“(这句话如何更好的理解呢?,自己迷糊了好一阵) 意思是 指针本身也有个地址用于取消对指针本身地址的引用?去引用存储在指针中的地址?可以这样理解吗? 还是 比如 格化式 输出整形 %d *pointer *这里的取消引用运算符 意思是 因为指针本身存储的值是个地址跟要输出的格式化格式不一致 不能输出指针本身存储的值、也就是不输出指针变量中存储的值 (因为存储的是地址),而是输出存储在 指针中的地址中的值,就是引用了存储在指针中的地址的值。 “取消引用运算符,因为它用于取消对指针的引用”单就这句话,是不是就是我理解的这个意思呢. 应该是吧,还会有别的意思吗,应该没有了 认为。 *运算符 不让指针输出它本身存的值(它本身只能存储地址)'而是要输出指针变量中存储的地址中所包含的数据类型值。 来源: oschina 链接: https://my.oschina.net/u/940580/blog/140264

C++常见问题:引用和指针的区别

最后都变了- 提交于 2020-01-07 08:55:55
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 指针和引用的区别 (1)引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 reference要求有初值. String & rs = string1; 由于没有所谓的 null reference 所以所以在使用前不需要进行测试其是否有值.,而使用指针则需要测试其的有效性. (2)指针可以被重新赋值而reference则总是指向最初或地的对象. (3)必须使用reference的场合. Operator[] 操作符 由于该操作符很特别地必须返回 [能够被当做assignment 赋值对象] 的东西,所以需要给他返回一个 reference. (4)其实引用在函数的参数中使用很经常. void Get***(const int& a) //这样使用了引用有可以保证不修改被引用的值 { } 引用和指针 ★ 相同点: 1. 都是地址的概念; 指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。 ★ 区别: 1. 指针是一个实体,而引用仅是个别名; 2. 引用使用时无需解引用(*),指针需要解引用; 3. 引用只能在定义时被初始化一次,之后不可变;指针可变; 引用

智能指针

↘锁芯ラ 提交于 2020-01-07 08:53:23
1.智能指针的分类    shared_ptr 允许多个指针指向同一个对象    unique_ptr 只允许唯一指针指向指定对象    weak_ptr 弱引用,指向 shared_ptr 所管理的对象   智能指针都定义在 memory 头文件中 2.shared_ptr   shared_ptr 是模板,创建时,必须提供指针指向的类型:     shared_ptr<string> p1; // shared_ptr 可以指向string     shared_ptr<list<int>> p2; // shared_ptr 可以指向 int 的 list   默认初始化的智能指针中保存着一个空指针 3.make_shared 函数   shared_ptr<int> p3 = make_shared<int>(42); // 指向一个值为 42 的 int 的shared_ptr   shared_ptr<string> p4 = make_shared<string>(5, 's'); // 指向一个值为 “sssss” 的 string   shared_ptr<int> p5 = make_shared<int>(); // 指向一个值为 0 的 int   auto p6 = make_shared<vector<string>>(); // 指向一个动态分配的空

如何判断一个变量是指针

我们两清 提交于 2020-01-07 05:17:27
1、面试问题 编写程序判断—个变量是不是指针。 2、指针的判别 拾遗 C++中仍然支持C语言中的可变参数函数 C++编译器的匹配调用优先级 1. 重载函数 2. 函数模板 3. 变参函数 思路 将变量分为两类:指针 vs 非指针 编写函数:指针变量调用时返回true ,非指针变量调用时返回false 函数模板与变参函数的化学反应 template <typename T> bool IsPtr(T* v) // match pointer { return true; } bool IsPtr(...) // match non-pointer { return false; } 编程实验 指针判断 test.cpp #include <iostream> using namespace std; class Test { public: Test() { } virtual ~Test() { } }; template <typename T> bool IsPtr(T* v) // match pointer { return true;} bool IsPtr(...) // match non-pointer {   return false; } int main(int argc, char *argv[]) {   int i = 0;   int* p = &i;

python--StringIO-在内存中读写str

笑着哭i 提交于 2020-01-07 03:38:29
StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写。StringIO就是在内存中读写str from io import StringIO ff = StringIO('Hello!\nHi!\nGoodbye!') f = StringIO() #创建StringIO对象--可以看做在内存中的文件 i=f.write('hello我是中国人\n') #写入字符串,自动移动读写指针 #返回值:返回字符串个数 i=f.write('李明\n') f.write('中国\n') str=f.getvalue() #读取字符串(全部) #不操作指针 ss=f.seek(0) #移动读写指针 """参数2: 为0时代表从文件开头开始算起 1代表从当前位置开始算起 2代表从文件末尾算起 ?? 如果操作成功,则返回新的指针位置,如果操作失败,则函数返回 -1 """ s=f.tell() #返回当前读写位置 # s = f.readline() #从当前位置开始读取一行,包括\n;自动移动读写指针 #s = f.readline(3) #从当前位置开始读取一行,包括\n;自动移动读写指针 # 参数 读取的最大字符数 #s=f.readlines() #读取所有行,返回一个字符串列表;;自动移动读写指针 #['hello我是中国人\n', '李明\n', '中国\n'] #s