指针数据类型 java_C/C++ 指针的小结——指针与其它数据类型(数组、字符串、函数、结构体)的关系...

一、指针与数组和字符串

1、指针与数组

当声明数时,编译器在连续的内存空间分配基本地址和足够的储存空间,以容纳数组的所有元素。基本地址是数组第一个元素(索引为0)的存储位置。编译器还把数组名定义为指向第一个元素的常量指针。

元素的地址是通过索引和数据类型的比例因子来计算的;例如: x[3]的地址 = 基本地址 + (3 x 整型数据的比例因子)

如何表示元素a[i][j]的(其中:int *p; p = a;);

0

1

2

3

4

5

1

2

3

4

p----指向第 0 行的指针;

p + i----指向第 i 行的指针;

*(p+i)----指向第 i 行的第一个元素的指针;

*(p+i)+j----指向第 i 行第 j 个元素的指针;

*((p+i)+j)----存储在(i, j)单元(即第 i 行第 j 列)的值。

数组 a 的基本地址为 &a[0][0],从这个地址开始,编译器按行为所有的元素分配连续的存储空间。例如:

int a[3][4] ={

{15,27,11,35},

{22,19,31,17},

{31,23,14,36}

}

数组a的存储如下:

|15 |27| 11| 35 |22 |19 |31 |17 |31 |23 |14 |36 | |--

如果把 p 声明为整型指针,并且初始地址为a[0][0](),那么:

a[i][j] = *(p+4*i+j);

2、指针与字符串

C语言支持另一种创建字符串的方法,即使用char类型的指针变量。例如:

char *str = "good";

上述声明语句创建了一个文本字符串,然后将其地址保存在指针变量str中;这样指针 str 就指向字符串 “good” 的第一个字符,如下所示:

|g(str) | o | o | d | \0 | |--

由此,可以用指针访问整个字符串:

printf("%s",str);

put(str);

当然,也可以用指针来访问字符串中的单个字符。

3、指针数组

指针的一项重要的应用就是处理字符串表,特别是处理行的长度可变的“凹凸不平的数组”时;例如:

char *name[3] = { "New Zealand", "Australia", "India" };

上面的声明语句只分配了28个字符,这足以保存所有的字符,具体如下:

|N| e |w | |Z |e |a |l |a| n| d| \0| |-- |A| u| s| t| r| a| l| i| a| \0| |I| n| d| i| a| \0| 下面的语句可以用来显示着三个名称:

for(i = 0; i <= 2; i++) printf("%s\n",name[i]);

要访问第 i 个名称的第 j 个字符,可以这样编写语句:

char c = *(name[i]+j);

二、指针与函数

1、将指针作为函数的参数

使用指针传递变量地址的函数调用过程称为引用调用(我们已经说过,传递变量实际值的过程称为 “按值调用”)。引用调用提供了一种机制,让被调用的函数可以修改调用函数中存储的值。 请注意以下代码:

//例一

void exchange(int *a, int *b)

{

int t;

t=*a;

*a=*b;

*b=t;

}

void main()

{

int x, y;

x = 100;

y = 200;

printf("%d ,%d\\n",x,y);

exchange(&x,&y);

printf("%d ,%d\\n",x,y);

}

//例二

void exchange(int *a, int *b)

{

int *t;

t=a;

a=b;

b=t;

printf("%d ,%d\n", *a, *b);

}

void main()

{

int x, y;

x = 100;

y = 200;

printf("%d ,%d\n", x, y);

exchange(&x,&y);

printf("%d ,%d\n", x, y);

}

代码例二并不会使x,y的值发生互换,因为当函数指针a,b获得x,y的地址后,作为值进行储存,交换a,b的值并没有改变其值(x,y的地址)指向的x,y的值。

2、函数返回指针

指针是C语言的一种数据类型,因此也可以使用函数返回一个指向调用函数的指针。请看下面的代码:

int *larger(int* , int*);/*prototype*/

main()

{

int a = 10;

int b = 20;

int *p;

p = larger(&a, &b);/*Function call*/

printf("%d",p);

}

int *larger(int *x, int *y)

{

if(*x > *y)

return(x);/*address of a*/

else

return(y);/*address of b*/

}

注意:返回的地址必须是调用函数中变量的地址。如果返回的是指向被调用函数中局部变量的地址;将产生错误。

3、指向函数的指针

与变量一样,函数也属于某种数据类型,在内存中也需要有储存地址。因此可以声明一个指向函数的指针。如同指向字符数组的指针,可以接收任意大小的字符数组一样,指向函数的指针可以指向任意的函数,如此可以减少函数的数量,使函数的功能更加强大。指向函数的指针声明如下:

type (*fptr)();

该语句告诉编译器,fptr为指向函数的的指针,返回type类型的值。用括号把*fptr括起来是必要的。记住,下面的语句:

type *gptr();

表示的是把gptr声明为函数,它返回一个指向type类型的指针。

请仔细关注以下代码:

#include

#include

#define PI 3.1415926

double table(double (*f)(), double, double, double);

double y(double);

double cos(double);

double table(double (*f)(), double min, double max, double step)

{

double a, value;

for(a = min;a <= max; a+=step){

value = (*f)(a);

printf("%5.2f %10.4f\n,a,value");

}

}

double y(double x)

{

return (2*x*x-x+1);

}

void main()

{

printf("table of y(x) = 2*x*x-x+1\n\n");

table(y, 0.0, 2.0, 0.5);

printf("table of cos(x)\n\n");

table(cos, 0.0, PI, 0.5);

}

三、指针与结构体

在前面章节中,我们讨论把结构体作为参数传递给函数。我们还看到这样的实例,其中函数接收整个结构体的副本,并在运行后把他返回给调用函数。正如我们前面介绍的那样,该方法无论是在运行速度还是在内存使用上都不是高效的。通过以指向结构体的指针作为传递参数,然后使用指针来操纵结构体成员,就可以克服该缺点。请看以下函数:

print_invent(struct *item)

{

printf("Name: %s\n", item->name);

printf("price:%f\n", item->price);

}

该函数可以用下面的语句来调用:

print_invent(&product);

请关注以下两点:

数组名表示的是第0个元素的地址。结构体变量的数组名也是如此;

运算符“->”、“.”、“()”和“[]”的有先级最高。正确理解优先级及关联性非常重要。

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

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

相关文章

Linux tr命令详解

tr是个简单的替换命令&#xff0c;从标准输入中替换、缩减和/或删除字符&#xff0c;并将结果写到标准输出。 tr常见命令参数 用法&#xff1a;tr [选项]... SET1 [SET2] 从标准输入中替换、缩减和/或删除字符&#xff0c;并将结果写到标准输出。-c, -C, --complement …

512M内存编译php出错

make时错误如下 1 virtual memory exhausted: Cannot allocate memory make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1 内存小造成的&#xff0c;为了成功的话需要加上参数 –disable-fileinfo即可参考链接&#xff1a;https://bugs.php.net/bug.php?id48809 转载于…

Android中插件开发篇总结和概述

刚刚终于写完了插件开发的最后一篇文章&#xff0c;下面就来总结一下&#xff0c;关于Android中插件篇从去年的11月份就开始规划了&#xff0c;主要从三个方面去解读Android中插件开发原理。说白了&#xff0c;插件开发的原理就是&#xff1a;动态加载技术。但是我们在开发插件…

java反射机制 路径_Java 反射机制详解

引言本文主要介绍Java中&#xff0c;有关反射机制、类的加载过程、以及控制反转方面的内容。Java 反射机制Java创建对象的方式有哪些&#xff1a;new、反射、反序列化、克隆class对象获取的方法有哪些&#xff1a;类名.class、getClass、forName、classLoader.loadClass(‘包类…

prop和attr在 jquery的

https://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html转载于:https://www.cnblogs.com/beimingbingpo/p/9254680.html

java传入数据库生成柱状图_Java读取数据库数据生成柱状图

此案例是用swing显示数据的。须要引入jfreechart相关包。不同版本号可能包不同样。本人用的是此案例在ssi框架下会报错&#xff0c;不用框架就没问题。Java后台逻辑代码&#xff1a;public class BarChart {ChartPanel frame1;public BarChart() {CategoryDataset dataset get…

SVN系列操作(一)

SVN是什么&#xff1f; SVN是Subversion的简称&#xff0c;是一个开放源代码的版本控制系统&#xff0c;常用于软件开发项目中&#xff0c;实现代码、文档等的历史版本保存、共享和权限管理。 进入SVN本地目录&#xff0c;第一步操作就是update。 为什么呢&#xff1f;因为SVN是…

ubuntu-14.04.2-desktop使用方法

一、安装VMware Tools 1. 在VMware Workstation11.1.0下安装Ubuntu镜像&#xff1a;ubuntukylin-14.04.2-desktop-amd64.iso 2. 点击虚拟机菜单栏-安装VMware Tools。 3. 在Ubuntu系统光盘中找到VMwareTools-9.9.2-2496486.tar.gz&#xff0c;右键复制到“桌面”&#xff0c;然…

ubuntu 跟xshell的问题

有2个分析&#xff1a; 1&#xff1a;是windos的防火墙没有关闭 2&#xff1a;是虚拟机没有安装sshd服务器 ubuntu在CLI界面下输入&#xff1a;dpkg -l |grep ssh 因为是我安装过的sshd server 要是没有sshd server 就要输入 安装。 三&#xff1a;要是安装完之后 链接显示说…

java gdal postgresql_使用GDAL/OGR操作Postgresql数据库

&#xfeff;&#xfeff;GDAL(Geospatial Data AbstractionLibrary)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。本文将使用GDAL/OGR库读写Postgresql数据库中的表&#x…

Go语言基础之1--标识符、关键字、变量和常量、数据类型、Go的基本程序结构、Golang的特性...

一、前言 当我们项目较为简单时&#xff0c;我们在src目录下新建一个该项目目录&#xff0c;里面存放源码文件即可&#xff0c;见下图&#xff1a; 当我们一个项目较为复杂时&#xff0c;我们可以在src目录下新建一个该项目目录&#xff0c;在针对该项目不同模块创建不同目录&a…

java参数转换匹配规律_隐式转换规则

隐式转换在如下三种不同的情况会被考虑&#xff1a;1、当对象A调用某个方法时&#xff0c;这个方法不存在例如在前一节介绍的1 to 10。会将Int转换为RichInt&#xff0c;然后再调用to方法。在这种情况下&#xff0c;会将对象A(方法的调用者)隐式转换为另一个对象。2、当对象A调…

Semantic-UI的React实现(二):CSS类构造模块

更简单的类名标签 Semantic-UI使用了更简单的类名声明。用过Bootstrap的同学都会被其复杂的类名标签折磨过&#xff0c;例如一个简单的按键样式&#xff0c;不论颜色或是大小&#xff0c;都需要btn-前缀声明&#xff1a; <button type"button" class"btn btn…

T-SQL LIKE子句 模糊查询

MS SQL Server LIKE子句用于使用通配符运算符将值与类似值进行比较。 有两个通配符与LIKE运算符结合使用: 百分号&#xff08;&#xff05;&#xff09;下划线&#xff08;_&#xff09;百分号表示零个&#xff0c;一个或多个字符。 下划线表示单个数字或字符。 符号可以组合使…

ext springmvc mysql_基于ExtJs6前台,SpringMVC-Spring-Mybatis,resteasy,mysql无限极表设计,实现树状展示数据(treepanel)...

先从后台讲起1.表的设计2.mysql查询很容易&#xff0c;关键是要把id,text,parentId查出来/p>"http://mybatis.org/dtd/mybatis-3-mapper.dtd">SELECTbp.id,bb.name brandName,bp.name text,bp.photo_url photoUrl,bp.number,bp.add_time addTime,bp.modify_tim…

C# 之 Int16 Int32 Int64 的区别

Int16 值类型表示值介于 -32768 到 32767 之间的有符号整数。 Int32 值类型表示值介于 -2,147,483,648 到 2,147,483,647 之间的有符号整数。 Int64 值类型表示值介于 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之间的整数。 --------------------------------…

php说明代码怎么写,代码怎么写 - 起步 - PHP基础 - KK的小故事

起步 - 代码怎么写 作者&#xff1a;KK发表日期&#xff1a;2016.3.9要写PHP代码就需要建立.php后缀的文件,并且在文件里要以<?php 具体代码 ?>这样的形式来书写PHP代码我们在网站目录下新建一个叫index.php的文件,并在里面编写这样的代码:echo Hello World!;?>然后…

python中的计算符号

1、算数计算符号&#xff1a; - * /   //&#xff08;取整&#xff09;  %&#xff08;取余&#xff09;  **&#xff08;次方&#xff09; 1 >>> 682 143 >>> 9-34 65 >>> 3*46 127 >>> 16/28 8.09 >>> 9/2 10 4.5 11 >…

MySQL 索引优化全攻略

2019独角兽企业重金招聘Python工程师标准>>> 所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找。而用的最多,并且是mysql默认的就是二叉树算法 BTREE,通过BTREE算法建立索引的字…

织梦DedeCMS实现 三级栏目_二级栏目_一级栏目_网站名称 的效果代码

1.将官方原来的排列方式反过来&#xff0c;找到include/typelink.class.php第164行 $this->valuePositionName $tinfos[typename].$this->SplitSymbol.$this->valuePositionName; 修改为&#xff1a; $this->valuePositionName $this->valuePositionName.$…