在论坛里经常见到一些新人对指针提出一些问题,作为一个经历过许多错误后的新手,我想把自己的经历说出来,避免让后来人继续这样的错误.    在讲解指针之前,需要理解一下内存空间.内存是随机存取器,计算机上电后便利用内存进行运转.其有一定的容量,为了标识每个存储单元的位置,我们为内存设置了内存地址.内存的具体组织结构可以参考计算机组成原理.    指针是一种指向某种类型的特殊的型别.一般用*定义.如int *p,这样就定义了一个指向int类型的指针.指针用于指向某块内存空间,该内存空间里面存放了其所指…
本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C语言函数指针的基础开始介绍,再结合一些简单的用法和关于函数名称和地址的趣闻.在最后,本文给出一种简单的方式来看待函数指针,让你对其用法有一个更清晰的理解. 函数指针和一个简单的函数 我们从一个非常简单的”Hello World“函数入手,来见识一下怎样创建一个函数指针. 1 2 3 4 5 6 7…
以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做了个小小的实验,发现的确老师的答案是错误的.废话不多说,直接上代码: #include<iostream> using namespace std; void main(){double j=5;double &i=j;double *pi=&i;cout<<"…
C语言数组与指针的那些事儿 在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵.但是程序员一般都有一种迷之自信,总认为自己是天选之人,明知山有虎,偏向虎山行,直到最后用C的人都要被指针虐一遍. 指针 首先,明确一个概念,指针是什么,一旦提到这个老生常谈且富有争议性的话题,那真是1000个人有1000种看法. 在国内的很多教材中,给出的定义一般就是"指针就是地址",从初步理解指针的角度来说,这种…
见:C语言初学者代码中的常见错误与瑕疵(23)…
对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据是地址.地址又是什么概念?每一段内存都有其相应的地址,用街道来比喻的话,地址就是门牌号,数据就储存在家里.指针变量的作用就是储存门牌号. 定义一个指针变量要加一个*号.这里要提及两个概念,指针的类型和指针指向的类型.首先来说一下指针的类型.一般来说,指针类型要与指针指向的类型相匹配,不匹配的话往往会…
问题: 问题出处见 C语言初学者代码中的常见错误与瑕疵(5) . 在该文的最后,曾提到完成的代码还有进一步改进的余地.本文完成了这个改进.所以本文讨论的并不是初学者代码中的常见错误与瑕疵,而是对我自己代码的改进和优化.标题只是为了保持系列的连续性. 改进 程序的总体思想没有改变,所以main()函数不需要任何改动. int main( void ) { unsigned n ; puts( "数据组数=?" ); scanf( "%u" , &n ); )…
问题: 素数 在世博园某信息通信馆中,游客可利用手机等终端参与互动小游戏,与虚拟人物Kr. Kong 进行猜数比赛. 当屏幕出现一个整数X时,若你能比Kr. Kong更快的发出最接近它的素数答案,你将会获得一个意想不到的礼物. 例如:当屏幕出现22时,你的回答应是23:当屏幕出现8时,你的回答应是7: 若X本身是素数,则回答X;若最接近X的素数有两个时,则回答大于它的素数. 输入:第一行:N 要竞猜的整数个数 接下来有N行,每行有一个正整数X 输出:输出有N行,每行是对应X的最接近它的素数 样例…
C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type…
见:C语言初学者代码中的常见错误与瑕疵(19)…
见:C语言初学者代码中的常见错误与瑕疵(14) 相关链接:http://www.anycodex.com/blog/?p=87…
前文链接:分数的加减法——C语言初学者代码中的常见错误与瑕疵(11) 重构 题目的修正 我抛弃了原题中“其中a, b, c, d是一个0-9的整数”这样的前提条件,因为这种限制毫无必要.只假设a, b, c, d是十进制整数形式的字符序列. 我也不清楚这种题目应该如何结束输入.下面的代码假设在没有正确输入完整的运算式时结束. 数据结构 typedef struct { int numer ; //分子 int denom ; //分母 } frac_t ;//分数类型 数据 一共需要三个变量,两…
题目 字母的个数 现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果出现次数最多字母有多个那么输出最小的那个. 输入:第一行输入一个正整数T(0<T<25) 随后T行输入一个字符串s,s长度小于1010. 输出:每组数据输出占一行,输出出现次数最多的字符: 样例: 输入 3 abcd bbaa jsdhfjkshdfjksahdfjkhsajkf 输出: a a j 原代码 #include <stdio.h> #include <string.h&g…
在 C语言初学者代码中的常见错误与瑕疵(7) 中,我给出的重构代码中存在BUG.这个BUG是在飞鸟_Asuka网友指出“是不是时间复杂度比较大”,并说他“第一眼看到我就想把它当成一个数学问题来做”之后,我又重新对问题进行了数学式的思考后发现的. 这个BUG源于在(1<=A,B<=1000)条件下对矩形个数的数量级心里没数.当时觉得这个题目的目的是考察穷举,由于题目限定了A.B的范围,所以结果应该不是很大.事实证明这种想法是一厢情愿. 通常情况下,我不喜欢用数学方法解决C语言编程问题.因为很多问…
问题: 矩形的个数 在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3*1的矩形和1个3*2的矩形,总共18个矩形.给出A,B,计算可以从中找到多少个矩形 输入: 本题有多组输入数据(<10000),你必须处理到EOF为止 输入2个整数A,B(1<=A,B<=1000) 输出: 输出找到的矩形数. 样例: 输入: 1 2 3 2 输出: 3 18 原代码-1: #include <stdio.h> int rectang…
(内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include <stdio.h> int main() { char *s = "I love you"; char *s1 = "you love me"; char *s2 = "she love you"; char *s3 = "he l…
这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的const和#define有什么优缺点呢?说好的进程和线程有什么区别和联系呢?说好的进程间通信有哪些方式呢?说好的%¥%#--@--*&()#!@#*--"--#%#%#呢? 说好的这些面试题,统统都没有.一上来就来这么一个问题.加上本身语言表达能力不够好,当时的心情就是这样的:不淡定中带点…
C语言的指针变量 在C语言中,变量是固定范围的存储空间,它存储的是赋给他的值, 比如: ; /* 这里是定义一个整型变量a,并把12这个值存储在a的地址空间上 这个地址空间是系统随机分配的,对用户是透明的不用关心 */ 指针变量存储的是变量的地址, 比如: , *b; b = &a; /*如上,定义了一个整型变量a并赋值12,一个整型指针变量b 然后 用 & 取值运算符 取到变量a的地址空间值,存储到指针变量b中 此时变量b中存储的是变量a中的地址空间(这点尤其要注意,指针变量存储的是地址…
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面也讲了许多,也提到了多级指针的概念,那具体我们怎么去操作呢 #include <stdio.h> #include <stdlib.h> main(){ int i = 3; //一级 int* p = &i; //二级,保存一级指针 int** w = &p; //三…
1.“对外部(局部)变量的访问”是C语言函数指针的最大弱点 . #include <stdio.h> #include <stdlib.h> /* 结构体定义 */ struct node { struct node *next; int val; }; /* 函数指针类型 */ typedef void (*func_t)(int); /* 循环用函数 */ void foreach(struct node *list,func_t func) { while(list) { f…
Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func .   相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有类似C语言的指针这个相对古老的特性.但不同于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,而且也不能对指针做整数运算.从这一点看,Golang 的指针基本就是一种…
C语言函数指针 和 OC-Block 一. C语言函数指针 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/2967037.html #include <stdio.h> //在main之前定义一个函数 int sum(int a, int b) { return a + b; } int main() { //定义函数指针变量pfunc,指向sum函数 int (*pfunc)(int a, int b) = su…
昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文章中的内容參考自<C程序设计语言> 指针是什么就不具体说明了,用一句话来总结就是:"指针是一种保存变量地址的变量". 1.声明简单的指针变量 先看看代码: int i = 1; int *p; //声明一个指向int类型数据的指针变量 p p = &i; //&…
友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指针,比如int *p,4个属性分别如下: C语言指针p=(指针自己的值,与星号结合名,有用数据的值,有用数据的类型); 这4个属性用来理解C语言中单个指针可以,那么本篇再用这4个属性来解释C语言中的"指针的指针". C语言中指针的指针,好多教材一般给出的定义是"变量的地址的地址&…
package main import "fmt" //指针 //go语言的指针是非常容易学习的,比c中容易很多,他可以更简单的执行一些任务 //与变量类型,使用前需要定义 func test18_1() { var a int a = 10 b := 10 fmt.Println(a) fmt.Println(&a,&b) //使用&符号可以打印变量a的内存地址 //申明一个普通的变量 var c int c = 30 //申明一个指针变量,一个指针变量的值就…
1.指针 学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的. 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址.请看下面的实例,它将输出定义的变量地址: int var1; ]; printf("var1 变量的地址: %p\n", &var1 ); /…
快速上手系列-C语言之指针篇(一) 浊酒敬风尘 发布时间:18-06-2108:29 指针的灵活运用使得c语言更加强大,指针是C语言中十分重要的部分,可以说指针是C语言的灵魂.当然指针不是万能的,但没有指针是万万不能的,有些操作没有指针是办不到的,如动态内存分配.鉴于学习指针的必要性,从现在开始介绍指针方面的知识,本篇主要介绍指针相关概念及指针的定义与应用两方面的内容: 指针相关概念 1.指针: 我们使用的计算机内存为8G,系统为了更好地管理我们的内存,就为内存区的每一个字节都分配一个编号(唯一…
指针和内存 指针变量也是个变量,不过保存的是另一个变量的地址.另外编译器还会记住指针所指向变量的类型,从而在指针运算时根据变量类型采取不同操作. 例如,char * a 定义了char 类型的指针变量 a,通过 *a 读取数据时,每次只会读一个字节(char 类型变量的长度).而int * i 定义了 int 类型的指针变量 i,通过 *i 读取数据时,每次会读两个或四个字节(int 类型变量的长度跟编译器平台有关). #include <stdio.h> int main() { int a…
C语言指针概述:1.计算机系统中,无论是存入或是取出数据都需要与内存单元打交道,物理器件通过地址编码寻找内存单元.2.地址编码是一种数据,C语言的指针类型正是为了表示这种计算机所特有的地址数据.3.存取内存单元是任何程序经常性的操作,前面按对象(或变量)名称直接访问内存单元.4.程序运行时申请到的内存空间只有地址没有名称,因此指针成为访问动态内存的唯一工具. 地址和指针的概念:1.程序中的数据对象总是存放在内存中,在生命期内这些对象占据一定的存储空间,有确定的存储位置.2.C语言将内存单元抽象为…
一.指针与引用的相关概念 什么是指针? 指针,全称为指针变量,是用来存储内存地址的一种变量.程序中,一般通过指针来访问其指向的内存地址中的内容(数据). 什么是引用? 引用,是C++中提出来的一种新的使用变量的方式,即,给实际变量起个别名,通过这个别名来引用实际的变量.标准C中不支持变量的引用. 指针与引用的区别? 1.指针是实实在在的变量,有自己的内存存储空间,它可以指向任何有效的变量. 2.引用是一种形式.方法,定义的引用变量,实际上是原实际变量的另一个名称(别名),引用变量本身没有自己的实…