2014-C++第6章指针

合集下载

《C++语言程序设计》第6章 数组 指针与字符串

《C++语言程序设计》第6章 数组  指针与字符串
• 例如:static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
• 可以只对部分元素初始化
• 例如:static int a[3][4]={{1},{0,6},{0,0,11}};
• 列出全部初始值时,第1维下标个数可以省略
• 例如:static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12}; • 或:static int a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
其中数组a的存储顺序为:
a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23
12
二维数组的初始化
• 将所有初值写在一个{}内,按顺序初始化
• 例如:static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
• 分行列出二维数组元素的初值
cout << "Moving the point to (" << newX << ", " << newY << ")" << endl; x = newX; y = newY; }
例6-3 对象数组应用举例
//6-3.cpp #include "Point.h" #include <iostream> using namespace std;
int main() {
cout << "Entering main..." << endl;

c语言指针 通俗易懂讲解

c语言指针 通俗易懂讲解

c语言指针通俗易懂讲解C语言是一门广泛使用的编程语言,而指针是C语言中的一个重要概念。

指针在C语言中具有非常重要的作用,它能够使我们更灵活地操作内存和数据。

但是,对于初学者来说,指针可能会是一个难以理解的概念。

因此,本文将以通俗易懂的方式解释C语言指针的概念和用法。

首先,我们来解释指针的基本概念。

在C语言中,指针是一个变量,其存储的值是内存地址。

你可以将指针看作是指向内存中某个特定位置的“指针”,通过这个指针,我们可以访问和修改该内存位置上的数据。

这个地址可以是任何数据类型,例如整数、字符、数组等。

那么,我们为什么要使用指针呢?使用指针有很多好处。

首先,通过指针,我们可以节省内存空间。

指针可以传递地址,而不是复制整个数据。

其次,指针能够使我们在函数之间传递数据更加高效。

当我们将指针作为参数传递给函数时,可以直接在函数内部修改传递进来的数据,而无需进行数据的复制。

最后,指针还可以用于动态分配内存,使我们能够更灵活地管理和操作内存。

接下来,我们来看一些指针的常见用法。

首先是指针的声明和初始化。

要声明一个指针变量,我们需要在变量前面加上“*”符号。

例如,int *ptr; 声明了一个指向整数的指针变量ptr。

要初始化指针,我们可以将其指向一个已存在的变量或者使用动态内存分配函数(例如malloc())进行初始化。

然后是指针的使用。

使用指针时,我们可以通过“*”运算符来访问指针所指向的值。

例如,*ptr将访问ptr指针指向的整数值。

我们还可以使用“&”运算符来获得变量的地址,例如,&num将返回变量num的地址。

另一个常见的指针用法是指针和数组的结合。

在C语言中,数组名称本质上是一个指向数组第一个元素的指针。

因此,我们可以使用指针来遍历数组中的元素,或者通过指针传递数组给函数。

我们还可以使用指针和结构体一起工作。

指针可以指向结构体,这使得我们能够动态创建结构体对象,并在需要时进行修改或访问。

C程序设计第6章指针ppt课件

C程序设计第6章指针ppt课件

int i,*p=a;
for(i=0;i<10;i++) cin>>*(p+i); //输入 a[0]~a[9]
cout<<endl;
cout<<a[i]<<″ ″;
for(p=a;p<(a+10);p++)
cout<<endl;
cout<<*p<<″ ″;
return 0;
cout<<endl;
}
p = & a;
cout < < p < < endl; if( p! = NULL)
{ * p= 1 0 ;
cout < < " 将 1 0 赋 值 给 p所 指 向 的 地 址 " < < endl;
}
else
17
cout < < " p是 空 指 针 , 不 能 使 用 ! " < < endl;
n 间接存取(间接访问)方式是指将变量I的地址存 放在另一个变量J中,通过变量J访问变量I的值.
0000

2000
3
I
2004
5
K
2006 2000
J

4
4. 指针与指针变量
. 指针: 一个变量的地址也称为该变量的指针。 . 指针变量: 用于存储其它变量的指针(即地址) 的变量。 . 指针变量的定义:
x;
a = 10;
x = y;
b = 20;
y=
temp;
swaepn(ad,lb; );

C语言程序设计(2014年清华大学出版社出版的图书)

C语言程序设计(2014年清华大学出版社出版的图书)
韩婷婷,女,硕士,鲁东大学信息与电气工程学院副软件工程系讲师。主要研究领域为模型驱动的软件工程, 软件测试,软件维护,形式化方法。
谢谢观看
C语言程序设计(2014年清华大学出 版社出版的图书)
2014年清华大学出版社出版的图书
01 成书过程
03 教材目录 05 教材特色
目录
02 内容简介 04 教学资源 06 作者简介
《C语言程序设计》是2014年清华大学出版社出版的图书,作者是宋丽华、雷鹏、张小峰、韩婷婷。 该书是普通高等教育“十一五”国家级规划教材、计算机系列教材。该教材可作为计算机类、电气信息类的 本科教材,也可作为科技工作者业务学习的参考用书。 该教材共分9章,以程序设计思想为中心,强化算法思想和规范化编程。
雷鹏,男,工学硕士,毕业于山东大学计算机软件与理论专业,鲁东大学信息与电气工程学院副教授。研究 方向为计算机算法设计与分析、Led照明最优化、伽马辐照装置放射源棒最优化排列、软件工程、程序设计。
张小峰,男,工学博士,鲁东大学信息与电气工程学院副教授。主要从事数字图像处理、模式识别等方面的 研究工作。先后为本科生讲授《离散数学》《信息论与编码》《算法分析与设计》等课程。
2014年6月1日,该教材由清华大学出版社出版。
内容简介
第1章C语言入门:介绍简单的C程序组成、C程序的运行环境,算法的特性以及描述算法的方法,结构化程序 设计思想。
第2章数据类型和表达式:介绍C语言的基本数据类型,数据的表示,常量和变量,运算符和表达式,以及表 达式的计算过程。
第3章C语言的基本控制结构:介绍了C语言的三种基本结构,包括C语句的种类、数据的输入与输出、选择结 构和循环结构,并通过程序实例分析了选择和循环结构的构造过程。
成书过程

Cyuyan-chapter06

Cyuyan-chapter06

0x804a020
6.1 指针与指针变量
• 6.1.1 指针的概念
指针和指针变量是两个完全不同的概念,指针 是一个地址,而指针变量是存放地址(指针) 的变量。
6.1 指针与指针变量
• 6.1.2 指针变量的定义
− 指针变量在使用前首先需要定义,定义指针变量的语法格式如下所示: 基类型 * 变量名; − 指针变量只能接受其他同类型变量的地址作为其值。获取变量地址的语 法格式如下所示: &变量名;
数组元素
a[0], *a, p[0], *p a[1],*(a+1), p[1],*(p+1)

a+i, &a[i], p+i, &p[i] a[i], *(a+i), p[i], *(p+i)
6.2 指针与数组
• 6.2.1 指针与一维数组
设定义:int a[3]={1, 2, 3}, *s=a; (1) s, *s (2) s++, *s++, a, *a a++, *a++ ×
10000)/4=3”,表示指针变量p2所指的元素与p1所指的元素之间差3个
同类型元素的大小。
6.1 指针与指针变量
• 6.1.4 指针的运算
3、同类指针关系运算 − 同类指针之间也可以进行关系运算,常用的关系运算符如“==”、 “!=”、“<”、“>”、“<=”、“>=”,都适用于同类指针间的关系 运算。 − 例6-5。
p++
a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
执行p++时,p实际增加了多少字节?

《C语言》指针 ppt课件

《C语言》指针  ppt课件
printf(“%c”, buf[i]); }
ppt课件
14
p1 buf main
p bubfu+f105
p2 buf+10
aalllloocc
bbeeggiinn bubfu+f10 nn 150
ppt课件
1 buf[0]
2 buf[1]
:
:
9
:
\0 buf[9]
a buf[10]
:
:
\0 buf[14]
第6章 指针
6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的深层应用
ppt课件
1
6.1 指针的引出
一. 地址与指针
1. 地址与取地址运算
C程序中的变量在内存中占有一个可标识的存储区,
d = *(++p) ; { ++p ; d = *p ; }
执行后 d 的值为 3 , *p 的值为 3
1010 23 a 5b 3c 3d
ppt课件
7
例6. 2
#include <stdio.h> void main( )
p1 &ba
5a
{ int *p1 , *p2 , *p , a , b ; scanf(“%d%d”, &a , &b);
p2 &ba
9b
p1 = &a ; p2 = &b ;
if (a<b) { p = p1 ; p1 = p2 ;
p &a
输出结果:
p2 = p ;

C语言程序设计 – 第 06 章课后习题

C语言程序设计 – 第 06 章课后习题

C语言程序设计– 第六章课后习题电子13-02班王双喜一、选择题1. C语言中一维数组的定义方式为:类型说明符数组名(C)A. [整型常量]B. [整型表达式]C. [整型常量]或[整型常量表达式]D. [常量表达式]2. C语言中引用数组元素时,下标表达式的类型为(C)A. 单精度型B. 双精度型C. 整型D. 指针型3. 若有定义:int a[3][4];,则对a数组元素的非法引用是(D)A. a[0][3*1]B. a[2][3]C. a[1+1][0]D. a[0][4](解释:A、B、C均正确,D看起来引用不太妥当,但其亦有其意义(a[0][4]等价于a[1][0]))4. 若有定义:int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};,则a数组的第一维大小是(C)A. 1B. 2C. 3D. 4(解释:共9个元素,除以3即可得第一维大小是3;若有余数,则应加1)5. 若有定义:int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};,则值为5的表达式是(C)A. a[5]B. a[a[4]]C. a[a[3]]D. a[a[5]]6. 要求定义包含8个int类型元素的一维数组,以下错误的定义语句是(A)A. int N = 8;int a[N]; B. #define N 3while (a[2*N+2];C. int a[] = {0, 1, 2, 3, 4, 5, 6, 7};D. int a[1+7] = {0};(解释:数组的大小必须是整型常量或整型常量表达式)7. 若二维数组a有m列,则在a[i][j]前的元素个数为(A)A. i * m + jB. j * m + iC. i * m + i - 1D. i * m + j - 18. 下面是对数组s的初始化,其中不正确的是(D)A. char s[5] = {"abc"};B. char s[5] = {'a', 'b', 'c'};C. char s[5] = "";D. char s[5] = "abcdef";(解释:D中元素个数太多,算上'\0'共六个,非法)9. 下面程序段的运行结果是(B)char c[] = "\t\v\\\0will\n";printf("%d", strlen(c));A. 14B. 3C. 9D. 字符串中有非法字符,输出值不确定(解释:字符串中第四个是'\0'即结束标志,因此字符串长度是3)10. 判断字符串s1是否等于s2,应当使用(D)A. if (s1 == s2)B. if (s1 = s2)C. if (strcpy(s1, s2))D. if (strcmp(s1, s2) == 0)(解释:对于字符串来讲,其名字的内容是该字符串的起始地址,不能通过比较名字来比较相等,而应该用专用的函数进行逐字符匹配)二、写出程序的执行结果1. 程序一:# include <stdio.h>main(){int a[3][3] = {1, 3, 5, 7, 9, 11, 13, 15, 17};int sum = 0, i, j;for (i = 0; i < 3; i++)for (j = 0; j < 3; j++){a[i][j] = i + j;if (i == j) sum = sum + a[i][j];}printf("sum = %d", sum);}执行结果:打印sum = 6.(解释:a中各个元素的值是其行和列数字之和,sum内保存a中对角线元素之和,即sum = 0 + 2 + 4)2. 程序二:# include <stdio.h>main(){int i, j, row, col, max;int a[3][4] = {{1, 2, 3, 4}, {9, 8, 7, 6}, {-1, -2, 0, 5}};max = a[0][0]; row = 0; col = 0;for (i = 0; i < 3; i++)for (j = 0; j < 4; j++)if (a[i][j] > max){max = a[i][j];row = i;col = j;}printf("max = %d, row = %d, col = %d\n", max, row, col);}执行结果:打印max = 9, row = 1, col = 0.(解释:此程序的功能是逐行逐列扫描元素,总是将最大的元素赋给max,并保存该元素的行数和列数;因此执行完毕后,max是最大的元素(9),row是其行数(1),col是其列数(0))3. 程序三:# include <stdio.h>main(){int a[4][4], i, j, k;for (i = 0; i < 4; i++)for (j = 0; j < 4; j++)a[i][j] = i - j;for (i = 0; i < 4; i++){for (j = 0; j <= i; j++)printf("%4d", a[i][j]);printf("\n");}}执行结果:第一行打印0;第二行打印1 0;第三行打印2 1 0;第四行打印3 2 1 0。

c语言中的指针详解

c语言中的指针详解

c语言中的指针详解在C语言中,指针是一种特殊的变量类型,它存储了一个变量的内存地址。

通过指针,我们可以间接访问和修改内存中的数据,这对于一些需要动态分配内存的操作非常有用。

以下是关于C语言指针的一些详细解释:1. 定义指针:使用"*"符号来定义指针变量。

例如,int* ptr; 定义了一个指向整型变量的指针 ptr。

2. 取址操作符(&):取地址操作符(&)用于获取变量的内存地址。

例如,&a 返回变量 a 的地址。

3. 解引用操作符(*):解引用操作符(*)用于访问指针所指向的变量的值。

例如,*ptr 返回指针 ptr 所指向的整型变量的值。

4. 动态内存分配:可以使用相关的库函数(如malloc和calloc)在运行时动态分配内存。

分配的内存可以通过指针来访问和使用,并且在使用完后应该使用free函数将其释放。

5. 空指针:空指针是一个特殊的指针值,表示指针不指向任何有效的内存地址。

可以将指针初始化为NULL来表示空指针。

6. 指针和数组:指针和数组在C语言中有密切的关系。

可以通过指针来访问数组元素,并且可以使用指针进行指针算术运算来遍历数组。

7. 传递指针给函数:可以将指针作为函数参数传递,以便在函数内部修改实际参数的值。

这种传递方式可以避免拷贝大量的数据,提高程序的效率。

8. 指针和字符串:字符串在C语言中实际上是以字符数组的形式表示的。

可以使用指针来访问和操作字符串。

需要注意的是,指针在使用时需要小心,因为不正确的操作可能导致程序崩溃或产生不可预料的结果。

对于初学者来说,理解指针的概念和使用方法可能需要一些时间和练习。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指针±整数=>指针 指针1 - 指针2=>整数


指针的赋值运算
阅读程序,分析结果: int a,b,*p=&a,*q=&b,*w; cout<<&a<<" "<<&b<<" "<<&p<<" "<<&q<<" "<<&w<<endl; cout<<a<<" "<<b<<" "<<p<<" "<<q<<" "<<w<<endl; cout<<*p<<"\t"<<*q<<endl; cin>>*p>>*q; 键盘输入:5 10 cout<<*p<<"\t"<<*q<<endl; cout<<a<<"\t"<<b<<endl; w=p; p=q; q=w; cout<<p<<"\t"<<q<<endl; cout<<*p<<"\t"<<*q<<endl; cout<<a<<"\t"<<b<<endl;
例6.1编写交换两个变量值的函数
(函数参数为指针类型) void swap(int *xp, int *yp) { … }
形参为指针变量
int main() { … swap(&x,&y); … return 0; }
实参为变量的地址
运行结果
返回指针的函数
声明格式: 类型 * 函数名(形式参数表);
P
1004
a[1]
20
P 1008 30 a[2]
指针p+整数i:是p所指元素之后的第i个元素 …… 指针p-整数i:是p所指元素之前的第i个元素
注意:地址值加1与算术值加1有区别 p=p+1;相当于 p=p+1*4;
数组与指针(续)
数组元素的其他表示形式
设 int i,b[5],*Ptr=b;
使用梯形法计算定积分 a f ( x)dx ,等份区间n=1000。 编写通用的计算定积分值的函数,分别计算以下定积分:
1. f(x)=sin(x) , a=0,b=1 2. g(x)=ex+sin(x) , a=0,b=2 3. h(x)=3x3+2x2-1 , a=0,b=3
b
分别定义为函数,如:
分析下面函数的功能 void print(int *ptr, int len) { for(int i=0;i<len;i++) { cout<<*ptr<<"\t"; ptr++; } 输出ptr所指向的数组 中len个元素值。 cout<<endl; }
测试主函数
int main() 数组无初值 { int a[10]; cout<<"函数调用前a的值:"<<endl; 调用输出函数 print(a,10); int_array(a,10); 产生随机数 cout<<"函数调用后a的值:"<<endl; print(a,10); 调用输出函数 return 0; }
∵ b[i]的地址可以用首地址+i表示即b+i ∴ b[i] 可以表示为: *(b+i)
又Ptr指向数组首地址,即Ptr的值等于b,
则*(b+i)与*(Ptr+i)等价,从而:
b[i] 、 *(b+i) 、*(Ptr+i) 、Ptr[i]等价
例:分析下面函数的功能
void int_array(int *ptr, int len) { int *qtr = ptr+len; 产生len个随机整数, while (ptr<qtr) 存放在ptr所指向的连 { 续空间中(对应数组) *ptr =rand(); ptr++; } }
指针数组
定义格式:
类型 *数组名[元素个数]; 例如:定义5个int型的指针数组 int *ptr[5]; 例6-5:利用字符型指针数组处理多个字符串。(找最大字符串) char *str[]={“Basic”, “Fortran”, “C++”,”Java”}; char *max=str[0]; for(int i=1;i<4;i++) { if(strcmp(str[i],max)>0) max=str[i]; } cout<<max<<endl;
如:int a=100, *ptr=&a; //ptr为指针变量
100 200
ptr
a
或 *ptr

cout<<*ptr<<“ “<<a<<endl; a+= *ptr; cout<<*ptr<<“ “<<a<<endl;
结果:100 100
结果:200 200
例如: int x = 5,y, *ptr=&x; y=++*ptr; 等价于:y=++(*ptr); 执行后,y=? x=?
double f(double x) { double g(double x)
double h(double x) { double y; y=(3*x+2)*x*x-1; return (exp(x)+sin(x)); return y; }
{ return sin(x);
}
}
用梯形法求解定积分的通用函数代码
*(指针变量+下标)或 指针变量[下标]
例6-4 编写在字符串中查找某字符的函数
函数原型:char *strchr(char *str, char c);
算法: 从str的第一个字符查起,查到字符后就返回该字符
的地址;查不到则返回空值NULL。
while(*str!=„\0‟) { if(*str==c)return str; str++; } return NULL; 完整程序如下:
指针的概念(续)
指针即地址,指针类型涉及与“地址”有关的数据。 指针变量是存放“地址”数据的变量, 指针变量的 值也称为指针。 使用指针的好处:
直接访问内存单元,方便引用数组元素,灵活处理字 符串。 在函数调用时,使用指针作函数参数,能够扩大程序 的处理能力。 能够“动态”使用内存空间,有效地处理复杂数据结 构的问题。
测试结果
字符串指针
字符串的指针是字符串的首地址,即第1个字符 (索引为0)的地址。使用char型指针变量存放 其首地址。 例: char *str; str=“Hello”; 或:char *str=“Hello”;
字符串常量可看成存放在一个一维的字符数组中,当指 针指向字符串后,引用字符串中的字符可使用:
指针变量的交换:
p
int a=5,b=10,*p=&a,*q=&b,*w;
a 5
q
b 10
P与q交换过程: w=p;
p
p=q;
q=w
a 5 w
q
b
10
6.3 函数与指针
指针作函数的参数 返回指针的函数 指向函数的指针
指针作函数的参数
指针作函数的形参,接受实参的地址,函数中通过该 指针能够间接访问实参数据,能够实现 “双向传递数 据”的目的。 例 用指针作参数填空。函数功能:找x和y的大数。
double integral(double a, double b, double (*fun)(double), int n) { double h = (b-a)/n; double sum=0; for(int i=1; i<=n; i++) sum +=(fun(a+(i-1)*h)+fun(a+i*h))*h/2; return sum; } 主函数中调用格式: y1=integral(0.0,1.0,f,1000); y2=integral(0.0,2.0,g,1000); y3=integral(0.0,3.0,h,1000);
char *strchr(char *str,char c) { while(*str!=c && *str!=„\0‟) str++; if(*str==c) return str; else return NULL; } int main() { char *str="abcdefghij"; char *p; p=strchr(str,'j'); if(p==NULL)cout<<"字符串中无该字符。"<<endl; else cout<<"该字符在串中的位置是:"<<p-str<<endl; cin.get(); return 0; }
注意:
相关文档
最新文档