李洪强-C语言1-指针
C语言指针
前导程序
一、基本知识点
Int a=10;
Int *p;//定义一个int类型的指针
P=&a;//指针变量p指向了变量a
*p=20;//使用指针不通过变量直接修改变量a的值为20
*p表示访问指针变量p指向的存储空间
指针一个作用:能够根据一个地址值,访问(取值 | 赋值)对应的存储空间
指针变量p前面的int,表示指针的类型
①. Int *p;
②. *p=10;
两个*的区别:前一个起标识作用,表明定义的p是一个指针,后者的*表示通过访问p指向的地址空间
二、指针使用注意
①. Int *p;
double d=10.0;
p=&d;//不建议此种做法
②. Int *p;
p=200;//指针变量只能存储地址
③. Int *p;
printf(“%d\n”,*p);//指针变量未经初始化,不要拿来间接访问其他的存储空间
④. Int *p=&a;但是不能写成 int *p;*p=&a;这种写法没有任何的意义,可以认为*是和类型符一起使用的。
⑤. *是指针运算符,访问指针指向的空间
三、指向指针的指针
Int a=10;
Int *p=&a;//指向int型的指针
Int **p1=&p;//指向指针的指针
Int ***p2=&p1;//三级指针
*p2相当于访问p1;
**p2相当于访问p;
***p2相当于访问a;
*p1相当于访问p;
一颗星一条线。
四、指针练习
编写一个函数,计算a和b的和与差(一个函数返回两个值)
提示:指针的作用之一:实现让函数拥有多个返回值
五、有关指针的疑问
注意:任何类型的指针都占据8个字节的存储空间,那么为什么还要为指针加上类型呢?
对下面一段代码进行内存分析,可以证明指针类型不正确带来的严重后果。
Int i=2;
Char c=1;
Int *p=&c;//本应该是char类型的,写成了int类型
Printf(“c的值是%d\n”,*p);//打印结果为513,而非1
Printf(“c的值是%d\n”,c);//值为1
下面是上述代码的结果的内存分析:
指针p访问的本应该是1个字节空间的数据,此时因为指针的类型是int型的,因此程序自然的从指向的地址0x0a开始读取了4个字节的数据,访问的数据从1变成了513。
提示:明确了指针的数据类型,指针才能够正确的访问应该访问的空间数据。
六、指针和数组
Int ages[5]={10,9,8,7,6};
遍历数组
For(int i=0;i<5;i++)
Printf(“%d\n”,ages[i]);
使用指针遍历数组
Int *p;
P=ages;//也可以写成p=&ages[0];,指针变量p指向了数组的首元素
元素的地址:
第一个元素的地址p &ages[0]
第二个元素的地址p+1 &ages[1]
第三个元素的地址p+2 &ages[2]
元素的值
*p ages[0]
*(p+1) ages[1]
*(p+2) ages[2]
把指针当做数组来用:
For(int i=0;i<5;i++)
Printf(“%d\n”,*(p+i));
(1)数组元素的三种访问形式:
①. 数组名[下标]
②. 指针变量名[下标]
③. *(p+1)
(2)指针变量的+1究竟是加多少?这取决于指针的类型,如果是char类型则加1个字节,如果是int类型的,则加4个字节。
(3)利用指针来接收一个数组,指针变量指向了数组的首元素。
Void change(int array[])等价于void change(int *array)。
前者存储的虽然是数组元素的首地址,但是在传递时就已经变成指针了。
示例:
Void change(int *array)
{
//Printf(“%d\n”,array[2]);
Printf(“%d\n”,*(array+2));
}
Int main()
{
Int ages[5]={1,2,3,4,5};
Change(ages);
}
调用的结果为:数组的第三个元素3
若改给change(&ages[2]);则调用的结果为5,因为此时array指向的是ages[2],把ages[2]当做了array的首元素
七、指针和字符串
(一)基础知识
下面两行代码有着本质的区别:
①. Char name[]=“it”;
②. Char *name2=“it”;//指针变量name2指向了字符串的首字符i
Char name[0]=‘y’;//改变第一个元素的值
Printf(“%s\n”,name);//打印结果为yt
*name2=‘y’;
Printf(“%s\n”,name2);//此时程序崩溃
这是因为,两者一个是字符串变量,一个是字符串常量。C语言的数组元素存放于栈,里面的元素可以随便修改,称为字符串变量。而字符串常量存放于常量区,会缓存起来是不可更改的。
Char *name1=“it”;
Char *name2=“it”;
Printf(“%p %p”,name1,name2);//地址是一样的,说明name1和name2指向的是同一个字符串。
掌握字符串定义的两种方式:
①. 利用数组
特点:字符串里边的字符是可以修改的,适用于内容需要经常修改时。
②. 利用指针
特点:其实是一个常量字符串,里面的字符不能修改,适用于字符串的内容不需要修改,且这个字符串经常被使用时。
(二)指针数组
整型数组:这个数组中存放的都是整型数组
指针数组:这个数组中存放的都是指针
Int ages[5];
Char *name[5]={“jack”,“rose”,“yang”};//字符串数组的常见写法
对应于:
Char name2[3][10]={“jack”,“rose”,“yang”};
保存字符串数组的两种方式:
①. 指针数组(字符串数组)
②. 二维字符数组(字符串数组)
如何输入字符串?(使用数组——因其可变)
Int main()
{
Char name[20];
Printf(“请输入姓名:\n”);
Scanf(“%s”,name);
Printf(“%s”,name);
}
八、返回指针的函数
程序示例:
#include<stdio.h>
Char *test();
Int main()
{
Char *name=test();
Printf(“name=%s\n”,name);
Return 0;
}
Char *test() //返回指针的函数
{
Return “rose”;
}
九、指向函数的指针
数组名即数组的地址,函数名即函数的地址。
假设有函数:
Void Test ()
{
Printf(“调用了test函数\n”);
}
Void (*p)(); //void指针变量指向的函数没有返回值,()表示p指向的函数没有形参
P=test; //有指针p,把指针p指向函数
有三种方式可以操纵函数:
①. 直接调用test();
②. 利用指针变量简介调用 (*p)();
③. 简化使用p()
练习:
假设有函数声明为 int sum(int a,int b)
则相对应的指向该函数的指针应该定义为:int (*p)(int ,int);
把指针变量p指向函数:p=sum;
调用该函数的三种方式:
(1)int c=p(10,12);
(2)Int c=sum(10,12);
(3)Int c=(*p)(10,12);
假设函数声明为:double haha(double a,char *b,int c);
则定义一个指向haha函数的指针应该为:double (*p)(double,char *,int)=haha;
李洪强-C语言1-指针的更多相关文章
- 李洪强-C语言9-C语言的数据,变量和常量
一.数据 图片文字等都是数据,在计算机中以0和1存储. (一)分类 数据分为静态数据和动态数据. ①. 静态数据:一些永久性的的数据,一般存储在硬盘中,只要硬盘没坏数据都是存在的.一般以文件的形式存储 ...
- 李洪强-C语言关键字、标识符和注释
一.关键字 C语言提供的有特殊含义的符号,共32个. 在Xcode中关键字全部高亮显示,关键字全部都为小写.如return.int等. 二.标识符 定义:标识符是程序员在程序中自定义的一些符号和名称. ...
- 李洪强 - C语言8-Scanf函数
C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间 ...
- 李洪强-C语言7-C语言运算符
C语言运算符 一.算术运算 C语言一共有34种运算符,包括常见的加减乘除运算. ①. 加法:+ 还可以表示正号 ②. 减法:- 还可以表示负号 ③. 乘法:* 非数学意义上的X ④. 除法:/ 注意 ...
- 李洪强-C语言6-控制结构
C语言流程控制 一.流程控制结构 (1)顺序结构:按书写顺序执行每一条语句. (2)选择结构:对给定的条件进行判断,根据判断结果决定执行哪一段代码. (3)循环结构:在给定条件成立的情况下,反复执行某 ...
- 李洪强-C语言5-函数
C语言函数 一.函数 C语言程序是由函数构成的,每个函数负责完成一部分的功能,函数将工恩呢该封装起来,以供程序调用. 二.函数定义 目的:将一些常用的功能封装起来,以供日后调用. 步骤:确定函数名,确 ...
- 李洪强-C语言4-内存分析
C语言内存分析 一.进制 概念:进制是一种计数方式,是数值的表现形式 4种主要的进制: ①. 十进制:0~9 ②. 二进制:0和1 ③. 八进制:0~7 ④. 十六进制:0~9+a b c d e f ...
- 李洪强-C语言3-数组
一.数组的概念 用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. 二.数组的定义 格式: 类型 数组名[元素个数]: 举例:存 ...
- 李洪强-C语言2-字符串
C语言字符串 一.字符串基础 注意:字符串一定以\0结尾. Printf(“yang\n”); 其中yang为字符串常量,“yang”=‘y’+‘a’+‘n’+‘g’+‘\0’.字符串由很多的字符 ...
随机推荐
- 【leetcode】4Sum
4Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d ...
- 56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]
[本文链接] http://www.cnblogs.com/hellogiser/p/is-balanced-tree.html [题目] 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉 ...
- sublime 实用 快捷键
alt+- 向后导航 alt+shift+- 向前导航 ctrl+shift+↑↓ 上下移动一行 ctrl+k,ctrl+u 转换所选为大写 ctrl+k,ctrl+l(字母L) 转换所选为小写 ct ...
- cenos配置
#修复ifconfig1.查看 /sbin/ifconfig是否存在 echo $PATH2.查看ifconfig命令是否存在ls /sbin |grep ifconfig如果ifconfig命令存在 ...
- jQuery操作DOM和CSS函数
function des html jquery result html() 获取元素中HTML内容 <div id="box" style="color:red& ...
- python基础——字符串和编码
python基础——字符串和编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用 ...
- cocos2dx实现象棋之运动
1.头文件 void moveStone(int moveid, int killid, int x, int y); void moveComplete(CCNode*, void*); bool ...
- kvm xxx.xml文件的位置
/var/run/libvirt/qemu/xxx.xml /etc/libvirt/qemu/xxx.xml
- wp8 --退出程序
重写OnBackKeyPress事件,设置 e.cancel=true:然后加弹窗代码,为确定按钮订阅事件委托,委托方法里加Application.Current.Terminate();退出方法即可
- Oracle 11g必须开启的服务及服务详细介绍(转)
成功安装Oracle 11g数据库后,你会发现自己电脑运行速度会变慢,配置较低的电脑甚至出现非常卡的状况,通过禁止非必须开启的Oracle服务可以提升电脑的运行速度.那么,具体该怎么做呢? 按照win ...