c语言指针

浅谈c语言的指针

≡放荡痞女 提交于 2020-01-18 05:12:14
对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了。c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分。 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据是地址。地址又是什么概念?每一段内存都有其相应的地址,用街道来比喻的话,地址就是门牌号,数据就储存在家里。指针变量的作用就是储存门牌号。 定义一个指针变量要加一个*号。这里要提及两个概念,指针的类型和指针指向的类型。首先来说一下指针的类型。一般来说,指针类型要与指针指向的类型相匹配,不匹配的话往往会有警告。但是指针类型可以不匹配指针指向的类型。指针类型可以是用原本存在的类型如int *,char *,也可以自己定义,如结构体指针等。我认为定义指针类型目的就是确定指针的步长,即对指针变量进行p++操作时,p的数据加了几个字节。如int *p进行p++时,p的数据加了四个字节(对于32位系统),因为int型占的内存就是4个字节。所以同样的,char *p进行p++操作时,p的数据加了一个字节。同样的,定义一个占20个字节的结构体stu,那么stu *p的p++里面数据增加20个字节。所以就可以用char *p来访问int类型中每一个字节的数据。程序和运行结果如下: 所以可以通过这样的方法来访问int定义的i中每一个字节所存储的内容,也可以通过这样的方法确定大小端。

错题集

吃可爱长大的小学妹 提交于 2020-01-17 05:28:56
1.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。 对。我的理解产生了错误。误以为返回值的是ascii码的大小。事实上int大于0则是1,小于则是-1。 2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。 错。数组名是地址,不是指针常量,它的值可以赋给指针。 3.有说明语句int a[4][5];,则a[2]+3表示 ( A) 。 A.a数组行下标为2、列下标为3的元素的地址 B.0a数组行下标为2、列下标为3的元素的值 C.a数组第2行的首地址 D.a数组第3行的首地址 a[2]表示地址。+3表示地址后移3个元素。 4.语句int *p; *p=50;执行时,不会有任何错误。 错。在执行时,*P没有值。printf不出来任何值。 5.对于以下结构定义,++p->str中的++加在 ( A) 。 struct { int len; char *str; } *p; A.指针str上 B.指针p上 C.str指的内容上 D.以上均不是 因为p->str是对指针str的引用。 6.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是(A)。 A.p->next=h B.p->next=NULL C.p->next->next=h D.p->.data=-1 p

C语言刷题(17):用指针变量作为函数参数传值,对输入的两个整数按大小顺序输出

微笑、不失礼 提交于 2020-01-16 05:46:43
# include <stdio.h> void main ( void ) { void swap ( int * a , int * b ) ; int a , b , * p , * q ; p = & a ; q = & b ; printf ( "input a and b:" ) ; scanf ( "%d %d" , & a , & b ) ; if ( * p < * q ) { swap ( p , q ) ; } printf ( "max = %d min = %d" , * p , * q ) ; } void swap ( int * a , int * b ) { int t ; t = * a ; * a = * b ; * b = t ; } 结果: input a and b : 5 66 max = 66 min = 5 来源: CSDN 作者: qq_1316238389 链接: https://blog.csdn.net/qq_38173631/article/details/103994982

第六周作业

跟風遠走 提交于 2020-01-16 04:56:25
这次作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/homework/2889 我在这个课程的目标是 熟练使用指针编程 这个作业在哪个具体方面帮助我实现目标 初步了解了指针变量的一些基本运算,复习了自定义函数 参考文献 https://baike.baidu.com/item/%E6%8C%87%E9%92%88/2878304?fr=aladdin 一、本周完成的作业 基础作业 题目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); printf ("y=%.2f\n"

C语言函数指针

我的梦境 提交于 2020-01-16 02:27:41
原理: 1、对于一个函数来说,他的函数名是函数的地址,一个指向函数代码的指针,是函数的入口地址,调用地址。 2、函数指针是一个指向函数的指针(获得函数名),函数指针指向函数名就可以替代该函数执行,去调用该函数 使用方法: 1,声明一个函数指针,统一接口(函数返回值类型和函数参数类型):返回值类型 ( 函数指针名)(参数列表) 函数指针名首先与 结合表明是指针,之后与()结合表明是指向函数的指针 2,指针指向要执行的函数地址(函数名) 3,用函数指针替代函数名执行该函数 代码 # include <stdio.h> # include <stdlib.h> typedef int ( * pfunc ) ( int , int ) ; //该函数指针的别名为pfunc,统一接口 int getMax ( int a , int b ) { return a > b ? a : b ; } int getMin ( int a , int b ) { return a < b ? a : b ; } void test01 ( ) { printf ( "getMax = %p, getMin = %p\n" , getMax , getMin ) ; //打印函数入口地址 } void test02 ( ) { int res = 0 ; pfunc p = NULL ; /

带你重新认识指针(下)

谁说胖子不能爱 提交于 2020-01-16 00:54:10
目录 真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。这是怎样的哀痛者和幸福者?然而造化又常常为庸人设计,以时间的流驶,来洗涤旧迹,仅使留下淡红的血色和微漠的悲哀。在这淡红的血色和微漠的悲哀中,又给人暂得偷生,维持着这似人非人的世界。我不知道这样的世界何时是一个尽头!我们还在这样的世上活着;我也早觉得有写一点东西的必要了。 ——鲁迅 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 点关注,不迷路!!!   看完我上一篇指针的讲解之后很多同学反馈很不错,有网友给私信说之前在大学里面一直搞不懂指针的问题,说到指针都是云里雾里,老师讲的也是很难听懂 , 点击即可进入 指针(上) 。也有很多网友表示非常期待指针下的文章,所以我就马不停蹄的继续写 ,下 主要讲解指针的特性以及指针安全问题。 指针的特性 指针和常量  先说下什么是常量,常量就是不可变的量,一旦定义该常量,其值在整个程序生命周期都是不可变的,常量存放在虚拟地址空间的常量区。  在C语言里面有两种定义常量的方法。 使用const关键字 , const 定义的是变量不是常量,只是这个变量的值不允许改变是常变量,带有类型。编译运行的时候起作用存在类型检查。 使用#define预处理器, define 定义的是不带类型的常数

C语言刷题(17):指针篇,使用指针实现数组逆置

家住魔仙堡 提交于 2020-01-16 00:51:28
# include <stdio.h> void main ( ) { void reverse ( int * a , int n ) ; int * p ; int a [ 10 ] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } ; reverse ( a , 10 ) ; for ( p = a ; p < a + 10 ; p ++ ) { printf ( "%d " , * p ) ; } } void reverse ( int * a , int n ) { int i , j , t ; for ( i = 0 ; i < n / 2 ; i ++ ) { t = * ( a + i ) ; * ( a + i ) = * ( a + 9 - i ) ; * ( a + 9 - i ) = t ; } } 结果: 9 8 7 6 5 4 3 2 1 0 来源: CSDN 作者: qq_1316238389 链接: https://blog.csdn.net/qq_38173631/article/details/103995447

【424】C语言二级指针

谁说胖子不能爱 提交于 2020-01-15 23:54:23
参考: C 指向指针的指针 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。 一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int 类型指针的指针: int **var; 当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符,如下面实例所示: var:int 变量 ptr:指向 var 的指针 pptr:指向 ptr 的指针 表示 var 值的三种方法: var *ptr:ptr 指针所对应的值,即 var **pptr:*pptr 指针所对应的值,即 ptr,所以 **pptr = *ptr = var 表示 ptr 值(var 地址,pptr 对应的值)的四种方法: &var:表示 var 的地址,即 ptr ptr &(*ptr):*ptr 相当于 var *pptr:*pptr 指针所对应的值,即 ptr,所以 *pptr = ptr = &var 表示 pptr 值(ptr 地址)的三种方法: &ptr:表示 ptr 的地址,即 pptr pptr &(*pptr):*pptr 相当于 ptr 表示 pptr 地址的方法: &pptr #include

2015年09月12日

☆樱花仙子☆ 提交于 2020-01-15 15:48:27
异或运算特性 a ^ b = c 则 c ^ b = a , c ^ a = b, 双向链表需要两个指针,一个指向前一个结点,一个指向后一个结点, 异或双向链表只用一个指针,该指针等于 前后两两个结点指针的异或的结果,这样节省了空间,但增加了计算。 一般的双向链表节点中包含两个指针,分别指向前驱和后继。异或指针双向链表的节点只有一个“指针”,这个指针是另外两个指针的“异或”值,并利用以下运算得到其前驱和后继的指针: a^(a^b)=b (a^b)^b=a 在C语言中,可以先把指针转换为无符号整型数然后进行异或,另外还应保存指向链表头尾节点的指针。 按照这种思路,节点中的这一个指针还可以是“加法”值,或者其他指针运算得到的值。如果是加法,可以利用以下运算得到其前驱和后继指针: (x+y)-x=y (x+y)-y=x 需要注意的是,这样的“加法”运算或“异或”运算都是针对指针的值本身的,即指针转换为无符号整型后的运算。不能跟指针运算(如两个指针相减)混淆。 异或指针双向链表的建立、遍历等参考如下实现。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

2019春第六周作业

与世无争的帅哥 提交于 2020-01-15 09:02:35
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-20 我在这个课程的目标是 能基本了解指针的定义与运用 这个作业在那个具体方面帮助我实现目标 本次作业有需要运用指针来返回多个数值 参考文献 C语言程序设计 求两数平方根之和 函数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); printf ("y=%.2f\n", y ); return 0; } /* 请在这里填写答案 */ 输入样例: 12 20 输出样例: y=7.94 实验代码 double fun (double *a,