指针

指针大小为什么与类型无关

情到浓时终转凉″ 提交于 2020-02-08 09:29:59
  指针的大小与硬件有关。   内存中有各种各样的数据,整型、浮点型、字符型等等。这些数据在内存中占据不同大小的储存空间,用sizeof运算符(注:sizeof是种运算符而不是函数,它在编译时发挥作用)进行运算时结果是不同的。然而不同类型的指针在相同系统环境下进行这种运算时结果却是相同的。   众所周知,C语言中的指针描述的是内存中的地址。而内存地址这种东西则是由CPU进行编址的。对于一个4位的CPU来讲,它能同时输出的数据为4位,即0000-1111共2^4 种情况,故这些二进制数字只能对应到16个位置的内存地址,即CPU仅能识别出16个内存地址。即便你的内存再大,它也显示只有16个位置的内存可用。这种原理同样应用于32位和64位的CPU。   32位的CPU能同时呈现32个位的数据,故有2^32 种情况,对应到2^32 个内存位置也就是最大3.85GB大小,因此32位的系统只能支持最大4GB的内存。相比之下,64位的CPU能同时吞吐2^64 位的数据,这显然能够对应到2^64 个内存的地址,而理论上这个大小换算成10进制则是相当大的数,如果对应到内存,此时一个很大的内存。所以我们说64位系统理论支持无穷大内存(这里的无穷大只是一种概念,因为我们不可能用到如此巨大容量的内存)。   综上,因为指针存放的是地址,所以32位内存,共4个字节;64位系统的64位地址共8个字节—

【LeetCode】11. 盛最多水的容器 python实现

让人想犯罪 __ 提交于 2020-02-08 07:44:12
题目描述 解题思路 方法二:双指针法 算法 这种方法背后的思路在于,两线段之间形成的区域总是会受到其中较短那条长度的限制。此外,两线段距离越远,得到的面积就越大。 我们在由线段长度构成的数组中使用两个指针,一个放在开始,一个置于末尾。 此外,我们会使用变量 m a x a r e a maxarea m a x a r e a 来持续存储到目前为止所获得的最大面积。 在每一步中,我们会找出指针所指向的两条线段形成的区域,更新 m a x a r e a maxarea m a x a r e a ,并将指向较短线段的指针向较长线段那端移动一步。 这种方法如何工作? 最初我们考虑由最外围两条线段构成的区域。现在,为了使面积最大化,我们需要考虑更长的两条线段之间的区域。 如果我们试图将指向较长线段的指针向内侧移动,矩形区域的面积将受限于较短的线段而不会获得任何增加。 但是,在同样的条件下,移动指向较短线段的指针尽管造成了矩形宽度的减小,但却可能会有助于面积的增大。 因为移动较短线段的指针会得到一条相对较长的线段,这可以克服由宽度减小而引起的面积减小。 Python代码 class Solution ( object ) : def maxArea ( self , height ) : """ :type height: List[int] :rtype: int """ ans =

指针做函数参数—20200207

我怕爱的太早我们不能终老 提交于 2020-02-08 03:00:45
题目要求: 有一个字符串”1a2b3d4z”,要求写一个函数实现如下功能, 功能1:把偶数位字符挑选出来,组成一个字符串1。 功能2:把奇数位字符挑选出来,组成一个字符串2。 功能3:把字符串1和字符串2,通过函数参数,传送给main,并打印。 功能4:主函数能测试通过。 int getStr1Str2(char *souce, char *buf1, char *buf2); 代码如下: #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> int getodd_even_number(char* input, char* odd, char* even) { int ret = 0; if (input == NULL) { ret = -1; printf("func error:%d\n", ret); return ret; } char* p = input; while (*p) { *even = *p; p++; even++; *odd = *p; p++; odd++; } return ret; } int main() { int ret = 0; char buf[] = "1a2b3c4d"; char result_odd

指针的详解(C++)

試著忘記壹切 提交于 2020-02-08 01:37:51
1.指针的含义 内存单元的编号叫做地址(Address),也称为指针(Pointer)。 1 内存单元的指针和内存单元的内容是两个不同的概念,从下图可以理解: 2. 一个指针是一个地址,是一个常量。而一个指针变量可以被赋予不同的指针值,是变量。 现在我们用C++语言在深入了解一下指针和地址的关系 #include <iostream> using namespace std; int main(){ int a = 3; int b = 12; int* c; c = &a; int** d; d = &c; cout << &a << endl; cout << &b << endl; cout << &c << endl; cout << &d << endl; cout << *c << endl; cout << **d << endl; cout << *d << endl; //&a cout << &*d << endl; //&c cout << **&d << endl; //&a } 2.1 先梳理一下代码的流程,定义一个两个int类型的变量并初始化,定义一个一级指针和一个二级指针并初始化,最后就是指针的使用。如下图所示: 2.1.1 所有的常量都存在常量池中,内存中保存的的常量池中常量的地址,c内存单元放的是a的地址,d内存单元放的是c的地址。 2.2.1

刷题总结--两数之和系列

主宰稳场 提交于 2020-02-08 01:10:08
题目1–1:两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 来源:力扣(LeetCode) 思路1 暴力求解: 复杂度分析: 时间复杂度:O(n^2) 空间复杂度:O(1)。 代码 class Solution { public int [ ] twoSum ( int [ ] nums , int target ) { int i = 0 ; int res [ ] = { 0 , 0 } ; while ( i < nums . length ) { for ( int j = i + 1 ; j < nums . length ; j ++ ) { if ( nums [ j ] == target - nums [ i ] ) { res [ 0 ] = i ; res [ 1 ] = j ; } } i ++ ; } return res ; } } 思路2 思路基本一样,只是使用HashMap以空间换取速度的方式,我们可以将查找

C语言第三周

跟風遠走 提交于 2020-02-08 00:58:54
一. 字符串常量 只要有一对双引号括起来的字符序列就是字符串常量。列如“hello"接”123" 注意: “a"是字符串常量‘a'是字符常量。 二、字符串储存 字符串的结束标志是‘\0’。 列如: char str[6]={'h',‘e','l','l','o','0','\0'}; 三、学习过程中遇到的问题与解决 1、C语言中,为什么字符串可以赋值给字符指针变量? char *p,a='5'; p=&a; //显然是正确的, p="abcd" //但为什么也可以这样赋值? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量,网上查资料学习了一下 答: 双引号做了3件事 : 1.申请了空间(在常量区),存放了字符串 2.在字符串尾加上了'/0' 3.返回地址 这里就是 返回的地址 赋值给了 p 二、char *p = “hello”; 上边的表达式为什么可以,而把p换成数组,然后再赋值就不行了 解释: 字符串常量"hello"出现在一个表达式中时,"hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。 所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。 char a[10] = “hello”; //这样可以,这种情况是c语言初始化所支持的 如果写成char a[10] 然后 a = “hello” 这样就错误了。

【LeetCode】环形链表II

夙愿已清 提交于 2020-02-08 00:55:02
题目描述 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 **说明:**不允许修改给定的链表。 示例1: 示例2: 示例3: 解题思路 可以分为两个部分。首先判断出该链表是否有环。其次,用相遇结点来找到环的入口。 第一部分:设置快、慢两个指针,慢指针走一步,快指针走两步。如果链表中不存在环,快指针最终会走到尾部,此时返回NULL;若链表中存在环,快指针最终会追上慢指针,返回相遇结点。 第二部分:设置meet指针指向根据第一部分找出的相遇结点,然后每次将meet指针和head指针往前移动一步,直到它们相遇,它们相遇的点就是环的入口,返回这个节点。 完整代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ //判断链表是否有环 struct ListNode * hasCycle ( struct ListNode * head ) { struct ListNode * fast = head ; struct ListNode * slow =

C++ 智能指针

陌路散爱 提交于 2020-02-07 20:52:42
4个智能指针, auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是C++11支持的,第一个已经被11弃用 auto_ptr, 采用所有权模式,such as: auto_ptr p1 ( new string ( "nice to meet you" ) ) ; auto_ptr p2 ; p2 = p1 ; //it's ok //但是当程序访问p1时程序会报错,所以存在内存崩溃问题 unique_ptr: 保证同一时间直能有一个智能指针指向该对象。 unique_ptr < string > p1 ( new string ( "nice to meet you" ) ) ; unique_ptr < string > p2 = p1 ; //#1 此时会报错 //此外unique还有一个地方。当程序将一个临时右值赋给一个unique_ptr时,编译器允许这么做 //如果你真的想上面#1处的操作,你可以使用标准库函数std::move(unique<T> t); unique_ptr < string > p1 ( new string ( "nice to meet you" ) ) ; unique_ptr < string > p2 = std :: move ( p1 ) ; //#2 allowed /

[C语言]指针与字符串

随声附和 提交于 2020-02-07 20:49:53
----------------------------------------------------------------------------- // main.c // Created by weichen on 15/2/1. // Copyright (c) 2015年 weichen. All rights reserved. #include <stdio.h> int main(int argc, const char * argv[]) { /*   取地址与获取大小:   1. 运算符sizeof可以给出某个类型或变量在内存中的字节数 2. scanf("%d", &a);里面的&为运算符;&用于获取变量的地址,其操作数必须是变量 3. &不能对没有的东西取地址,如:&(a++),&(++a);取地址符右边必须有一个变量   */ int a = 0; int b = (int)&a; //将a的地址强制类型转换为整型 printf("sizeof(a)=%ld\n", sizeof(a)); //4 printf("sizeof(int)=%ld\n", sizeof(int)); //4 //4. double变量在内存中占据的空间是int变量的两倍 //5. 地址的大小是否与int相同取决于编译器,取决于是32位还是64位架构,并不总是相同

双链表的基本操作---插入,删除,交,并,相邻元素的交换,不相邻元素的交换

你。 提交于 2020-02-07 15:42:52
这个链表是带有表头的双链表。实现链表的一些规范操作,初始化,插入,删除等。包括两个头文件list.h,fatal.h,库函数list.c,测试函数testlist.c。头文件放的都是函数声明,库函数list.c放的的函数的定义。 头文件list.h 1 typedef int ElementType; 2 #ifndef _List_H 3 struct Node; 4 typedef struct Node *PtrToNode; 5 typedef PtrToNode List; 6 typedef PtrToNode Position; 7 #include<stdbool.h> 8 List MakeEmpty(List L); 9 void DeleteList(List L); 10 bool IsEmpty(List L); 11 bool IsLast(Position P, List L); 12 Position Find(ElementType X, List L); 13 void Delete(ElementType X, List L); 14 void Insert(ElementType X, List L,Position P); 15 Position Header(List L); 16 Position First(List L); 17