c语言中的指针语法,C语言中指针的用法介绍

C语言中指针的用法介绍

for(int i=0;i

{

num+=*s;s++;

}

return num;

)

这个例子中的函数 fun统计一个字符串中各个字符的 ASCII 码值之和。前面说了,数组的名字也是一个指针。在函数调用中,当把 str 作为实参传递给形参 s后,实际是把 str 的值传递给了 s,s 所指向的地址就和 str 所指向的地址一致,但是str和s各自占用各自的存储空间。在函数体内对s进行自加1运算,并不意味着同时对str进行了自加1运算。

第八章。指针类型转换当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式。在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的。

例十四:

1。  float f=12.3;

2。  float *fptr=&f;

3。  int *p;

在上面的例子中,假如我们想让指针p指向实数 f,应该怎么搞?是用下面的语句吗?

p=&f;

不对。因为指针p的类型是 int*,它指向的类型是 int。表达式&f的结果是一个指针,指针的类型是 float*,它指向的类型是 float。两者不一致,直接赋值的方法是不行的。至少在我的MSVC++6.0上,对指针的赋值语句要求赋值号两边的类型一致,所指向的类型也一致,其它的编译器上我没试过,大家可以试试。为了实现我们的目的,需要进行"强制类型转换":

Generated by Foxit PDF Creator ? Foxit Software

http://www.foxitsoftware.com   For evaluation only.p=(int*)&f;

如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP*和TYPE,那么语法格式是:(TYPE*)p;

这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。而原来的指针p的一切属性都没有被修改。

一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,也会发生指针类型的转换。

例十五:

void fun(char*);

int a=125,b;

fun((char*)&a);

...

...

void fun(char*s)

{

char c;

c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;

c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;

}

}

注意这是一个32位程序,故 int 类型占了四个字节,char类型占一个字节。函数 fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗?在函数调用语句中,实参&a的结果是一个指针,它的类型是 int *,它指向的类型是 int。形参这个指针的类型是 char*,它指向的类型是 char。这样,在实参和形参的结合过程中,我们必须进行一次从 int*类型到 char*类型的转换。结合这个例子,我们可以这样来想象编译器进行转换的过程:编译器先构造一个临时指针  char*temp,然后执行 temp=(char*)&a,最后再把 temp 的值传递给 s。所以最后的结果是:s的类型是char*,它指向的类型是char,它指向的地址就是a的首地址。

我们已经知道,指针的值就是指针指向的地址,在32位程序中,指针的值其实是一个 32 位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象

下面的语句:

unsigned int a;

TYPE *ptr;//TYPE 是 int,char或结构类型等等类型。

...

...

a=20345686;

Generated by Foxit PDF Creator ? Foxit Software

http://www.foxitsoftware.com   For evaluation only.ptr=20345686;//我们的目的是要使指针ptr指向地址20345686(十进制

)

ptr=a;//我们的目的是要使指针ptr指向地址20345686(十进制)编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到

了吗?不,还有办法:

unsigned int a;

TYPE *ptr;//TYPE 是 int,char或结构类型等等类型。

...

...

a=某个数,这个数必须代表一个合法的地址;

ptr=(TYPE*)a;//呵呵,这就可以了。严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待。上面强调了a的值必须代表一个合法的地址,否则的话,在你使用ptr的时候,就会出现非法操作错误。想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个整数当作一个地址赋给一个指针:

例十六:

int a=123,b;

int *ptr=&a;

char *str;

b=(int)ptr;//把指针ptr的值当作一个整数取出来。

str=(char*)b;//把这个整数的值当作一个地址赋给指针str。好了,现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以

把一个整数值当作地址赋给一个指针。

第九章。指针的安全问题

看下面的例子:

例十七:

char s=’a’;

int *ptr;

ptr=(int*)&s;

*ptr=1298;

指针ptr是一个 int*类型的指针,它指向的类型是 int。它指向的地址就是 s的首地址。在 32 位程序中,s 占一个字节,int 类型占四个字节。最后一条语句不但改变了s所占的一个字节,还把和 s相临的高地址方向的三个字节也改变了。这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验吧 貌似有点难 伪造ip

解题链接: http://ctf5.shiyanbar.com/phpaudit/ 解答: 点击View the source code —>代码显示IP为1.1.1.1即可得到KEY—>使用modify header伪造IP—>拿到flag 相关: modify header我也是第一次用,下面附上相关说明&…

用C语言用指针怎么算通用定积分,C语言:利用指针编写程序,用梯形法计算给定的定积分实例...

题目要求利用指针编写程序,用梯形法计算下列公式中的定积分:参考代码首先说明一下指针的用处:因为所传递的参数均为数字,并不需要使用指针提高效率,故这里使用指针指向函数。请注意calc()函数中的这一语句:…

单点登录系统cas资料汇总

http://jasig.github.io/cas/4.0.x/index.html 主页https://jasigcas.herokuapp.com demohttps://wiki.jasig.org/display/CASUM/Home 4.x之前的文档http://jasig.github.io/cas/4.1.x/index.html …

有限小数用c语言,分数化为有限小数或无限循环小数(c实现)

问题描述:将分数转化为小数,相信很多人都会吧.那么,这里给定一个分数N/D,N为分子,D为分母(N,D均为整数),试编程求出N/D的小数形式,当然如果这个小数为无限循环小数,则把循环的部分用…

你该把前端外包出来了

2019独角兽企业重金招聘Python工程师标准>>> 移动热潮慢慢褪去,大的几个app已经霸占了所有的人桌面,而微信却变得越来越重要。微信里面,提倡H5的应用,H5应用开发成本低、上线快、易调整、跨平台等诸多优势,…

R 统计学工具部署和使用

由于公司内部对于市场数据分析的需求,要求引入R统计工具,并集成到报表工具中。对于R的介绍,大家请百度一下,当然,最好能去看官方的说明 https://www.r-project.org/ 下面简单介绍一下R工具的安装和数据分析工具Spotfir…

USACO Dual Palindromes

输出N个大于s的满足条件的数&#xff0c; 对于满足条件的数的定义是其2-10进制表示中&#xff0c;至少有两种表示为回文串。。还是暴力&#xff1a; /*ID: m1500293LANG: CPROG: dualpal */ #include <cstdio> #include <cstring> #include <algorithm>using…

c语言库函数fgets,C语言 标准I/O库函数 fgets 使用心得

char *fgets(char *s, int n, FILE *stream);参数说明&#xff1a;s --指定存放所读取的数据的位置n -- 指定所读取数据的最大长度(这个最大长度包括了字符串结束符 \0所占据的存储空间&#xff0c;因此&#xff0c;实际最大读取的有效字符数是 n - 1)stream --数据源&#xff…

Android下创建一个输入法

输入法是一种可以让用户输入文字的控件。Android提供了一套可扩展的输入法框架&#xff0c;使得应用程序可以让用户选择各种类型的输入法&#xff0c;比如基于触屏的键盘输入或者基于语音。当安装了特定输入法之后&#xff0c;用户即可在系统设置中选择个输入法&#xff0c;并在…

linux awk f,linux的awk详情(上)

一丶awk介绍AWK是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具&#xff0c;可以报告生成器&#xff0c;格式化文本输出1.常用语法awk [options] ‘program’ varvalue file…awk [options] -f programfile varvalue file…awk [options] BEGIN{ action;… } pa…

C#的async和await

C# 5.0中引入了async 和 await。这两个关键字可以让你更方便的写出异步代码。 看个例子&#xff1a; public class MyClass {public MyClass(){DisplayValue(); //这里不会阻塞System.Diagnostics.Debug.WriteLine("MyClass() End.");}public Task<double> Get…

eclipse创建android工程,在eclipse创建android 工程

1.在工具栏选择"New".在弹出对话框里&#xff0c;开打android文件夹&#xff0c;选择"android application Project"&#xff0c;选择“Next”.2.Application Name: 应用程序名称。Projetc Name: 工程名称。Packet Name: 包名称. 注意&#xff0c;包名称…

SQL select查询原理--查询语句执行原则转

1.单表查询&#xff1a;根据WHERE条件过滤表中的记录&#xff0c;形成中间表&#xff08;这个中间表对用户是不可见的&#xff09;&#xff1b;然后根据SELECT的选择列选择相应的列进行返回最终结果。 1)简单的单表查询 SELECT 字段 FROM 表名 WHERE 条件表达式 那它们是按什么…

android导航二级分类,Android实现腾讯新闻的新闻类别导航效果

效果图如下所示&#xff1a;1、在Adapter中加入如下代码private int clickTemp -1;//TODO 被选择的item下标/** * TODO 传入下标&#xff0c;设置被选择的item * * param position */public void setSelection(int position) {clickTemp position;}2、在Adapter的getView方法…

Linux下访问window挂载的磁盘

点击window挂在的磁盘,如下图左侧"文档". 出现如下错误: Error mounting /dev/sda3 .... Command-line mount -t "ntfs" -o "uhelperudisks2 修复办法: sudo ntfsfix /dev/sda6 参考资料: 1. win8安装ubuntu后不能访问windows其他磁盘转载于:https:…

linux遍历目录源代码

<pre code_snippet_id"1622396" snippet_file_name"blog_20160324_1_744516" name"code" class"cpp">遍历目录获取整个目录的占用空间: uint64_t dir_space(char *path) {int ret 0;uint64_t space 0;char cur_dir[PATH_MAX …

android studio 手动安装gradle,Android Studio 如何安装Gradle?

今天新下载安装了Android Studio 2.1&#xff0c;启动并新建第一个项目&#xff0c;结果卡在 gradle 上。网上搜原因&#xff0c;得到这个网页&#xff1a;http://blog.csdn.net/maxsky/article/details/50204093。说是要自己下载 gradle的压缩包&#xff0c;查了项目目录下的 …

Label 表达式绑定

Text<%#"总金额为: "Convert.ToString(Convert.ToDecimal(TextBox1.Text)*Convert.ToInt32(TextBox2.Text)%> Page_Load { Page.DataBind(); }转载于:https://www.cnblogs.com/handsomer/p/4150386.html

(转)如果知道dll文件是面向32位系统还是面向64位系统的?

本文为转载文章&#xff0c;原文地址&#xff1a;http://www.cnblogs.com/qguohog/archive/2011/09/13/2174897.html&#xff0c;仅仅是记录供后续使用&#xff0c;如有侵权请通知删除。 在发布dll时&#xff0c;可以选择编译为x86模式、x64模式以及Any Cpu模式等。那么对于已经…

Spring Roo 简介

一直以来&#xff0c;Java/Spring开发被认为是笨重的代表&#xff0c;无法快速生成项目原型和骨架。所以&#xff0c;Spring推出了Spring Roo这个项目&#xff0c;帮助我们快速生成项目原型。本文参考自Spring Roo的官方文档&#xff0c;如果熟悉英文的话可以直接看原文档&…