指向指针的指针变量

合集下载

C语言程序设计_谭浩强_第二版_CH10

C语言程序设计_谭浩强_第二版_CH10

}
第十章 指针 10.3 数组的指针和指向数组的指针变量 10.3.2 通过指针引用数组元素 例10.5输出数组中的全部元素。 ②通过数组名计算数组中元素的地址,找出元素的值。
main() {
int a[10],i; for(i=0;i<10;i++){scanf(“%d”,&a[i]);} print(“\n”); for(i=0;i<10;i++){printf(“%d”,*(a+i));} print(“\n”);
}
运行结果为: 100,10 100,10
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.1 通过指针变量访问整型变量
pointer_1 &a
a 100 *pointer_1
pointer_2 &b
b 10 *pointer_2
第十章 指针 10.2 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
pointer_1 &a
a 5 *pointer_1
pointer_2 &b
b 9 *pointer_2
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
b 5 *pointer_2
&b
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
pointer_1 &a
a 9 *pointer_1

《C语言程序设计》第8章指针

《C语言程序设计》第8章指针
}
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)

指针1

指针1

*pa=&a[0]; *pa=a[0];这两种赋值方法是错误。
因为a是数组首地址是地址常量,不是变量。
陕 西 师 范 大 学 物 理 学 与 信 息 技 术 学 院 版 权 所 有
指针
• 算术运算
指针变量的运算
C程序设计
– 指针与整数的加减运算:p++; p--; p += k; p -= k; -- p; ++ p; • 指针 p 加上或减去 k ,其意义是指针当前指向位置的前方或后方第 k 个数据的地址。 • 这种运算的结果值取决于指针指向的数据类型。 – 指针加一,减一运算 指向下一个或前一个数据。 例如:y=*px++ 相当于 y=*(px++) (*和++优先级相同,自右向左 运算)
通过指针引用数组元素 经过上述定义及赋值后:
– pa pa+1 pa+i *pa *(pa+1) *(pa+i) &a[0], &(a[1]) &(a[i]) a[0] a[1] a[i]. – a[i], *(a+i) , *(pa+i) pa[i]都是等效的。 – 通过pa++,能 ? 但是不能写 a++,为什么?
陕 西 师 范 大 学 物 理 学 与 信 息 技 术 学 院 版 权 所 有
指针
C程序设计
指针变量作为函数参数
• 指针变量也可作为函数参数,其作用就是 通过函数传递,将变量的地址传到另一个 函数中去 • 指针变量函数参数可以实现在被调函数中 操作主调函数中的变量。 • 各式如下:行参是指针变量;实参可以是 变量的地址,或指针变量。

c语言 指针的指针 用法详解

c语言 指针的指针 用法详解

c语言指针的指针用法详解在C语言中,指针是非常重要的一种数据类型。

而指针的指针是指指向指针变量的指针。

它在C语言中也是非常重要的一种数据类型,经常用于动态内存分配和函数传递参数等方面。

下面,我们来详细介绍一下指针的指针在C语言中的用法。

一、指针的基本概念在C语言中,指针是一个变量,用来表示另一个变量的内存地址。

指针变量可以存储任何数据类型的地址,包括整型、字符型、浮点型等。

使用指针可以实现动态内存分配、函数传递参数等功能。

二、指针的指针的概念指针的指针是指指向指针变量的指针。

它的定义方式如下:```int **p;```其中,p是一个指向指针的指针变量,它可以指向一个指针变量的地址。

三、指针的指针的用法指针的指针在C语言中有很多用途,下面列举几个比较常见的用法。

1.动态内存分配在C语言中,可以使用malloc函数动态分配内存,该函数返回的是一个指向分配内存的首地址的指针。

而在一些情况下,需要动态分配二维数组或者指针数组,这时就需要使用指针的指针了。

例如:```int **p;int i,j;p=(int **)malloc(sizeof(int*)*3);//分配3个指向int类型指针的指针变量for(i=0;i<3;i++){p[i]=(int*)malloc(sizeof(int)*4);//分配4个int类型的变量}for(i=0;i<3;i++){for(j=0;j<4;j++){p[i][j]=i*j;//为p[i][j]赋值}}```上述代码中,先使用malloc函数分配3个指向int类型指针的变量,然后再用循环分别为这3个变量分配4个int类型的变量。

最后,再使用嵌套循环为二维数组赋值。

2.函数传递参数在C语言中,函数可以通过指针传递参数。

指针的指针也可以用于函数传递参数,可以使函数返回多个值。

例如:```void fun(int **p){*p=(int*)malloc(sizeof(int)*4);//为指针p分配4个int类型的变量(*p)[0]=10;(*p)[1]=20;(*p)[2]=30;(*p)[3]=40;}int main(){int *p;fun(&p);//传递p的地址printf("%d %d %d %d\n",p[0],p[1],p[2],p[3]);free(p);//释放内存return 0;}```上述代码中,定义了一个指针类型的函数fun,在函数中通过指针的指针为指针p分配4个int类型的变量,并为这4个变量赋值。

指针的知识点

指针的知识点

指针的知识点指针是计算机编程中的一个概念,它用于存储内存地址。

以下是指针的一些常见知识点:1. 指针变量:指针变量是一种特殊类型的变量,它用于存储内存地址。

在大多数编程语言中,指针变量可以用来访问和操作存储在该地址上的数据。

2. 指针的声明:声明指针变量时需要指定它所指向的数据类型。

例如,int *p声明了一个指向整型数据的指针变量p。

3. 指针的解引用:解引用指针是指使用指针访问存储在该地址上的数据。

解引用操作使用"*"运算符,例如int *p,*p 表示解引用指针p,即访问p所指向的整型数据。

4. 指针的运算:指针可以进行一些运算,如加、减、比较等。

这些运算用于在内存中移动指针或访问特定位置的数据。

5. 指针的空值:在许多编程语言中,可以使用空指针(NULL)来表示一个指针变量没有指向任何有效的内存地址。

6. 指针的使用注意事项:使用指针需要小心,因为错误的指针操作可能会导致程序崩溃或出现不可预测的行为。

常见的注意事项包括空指针的判断、指针的生命周期、以及避免使用未初始化的指针。

7. 指针和数组:指针和数组之间有紧密的关系。

可以使用指针来访问和操作数组中的元素。

例如,可以使用指向数组的指针来遍历整个数组,或者通过指针运算来访问特定位置的元素。

8. 函数与指针:函数可以接受指针作为参数,也可以返回指针作为结果。

这使得可以使用指针来传递和返回数据,从而实现更灵活和高效的函数设计。

总的来说,指针是编程中的一个重要概念,它用于处理内存地址和访问存储在该地址上的数据。

正确使用和管理指针是编写可靠和高效代码的关键之一。

指针

指针

(main)
9 5 5 9 2000 2002
(swap)
2000 2002 5
...
…...
整型变量a 整型变量b 指针pointer_1 指针pointer_2
指针p1 指针p2
整型p
例 将数从大到小输出
swap(int *p1, int *p2) { int p; 2000 p=*p1; 2002 *p1=*p2; 2004 *p2=p; 2006 } 地址传递 2008 main() 200A { int a,b; int *pointer_1,*pointer_2; 200C scanf("%d,%d",&a,&b); 200E pointer_1=&a; pointer_2=&b; 2010 if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
#define NULL 0 int *p=NULL:
p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较
例 例 char *p; int *p1; ...... void *p2; while(p!=NULL) p1=(char *)p2; { ...… p2=(void *)p1; } 表示不指定p是指向哪一种 类型数据的指针变量
…...

整型变量i
i=3;-----直接访问
2000 2001 2002 2003 2004 3 20 10
变量i_pointer 2000
2005
2006
指针变量

*i_pointer=20; -----间接访问

C++ 面向对象程序第5章

C++ 面向对象程序第5章

//初始化 //输出指针变量p指向的变量count的值 //输出指针变量p的内容,即变量count的 //相当于count=count+1
程序执行结果
用指针存取变量
include "stdafx.h" #include "stdio.h" #include "iostream.h" void main() { int m, n; int *pm, *pn; //定义整型指针 m=100; //对变量m赋初值 n=200; //对变量n赋初值 pm=&m; //把变量m的地址赋给pm pn=&n; //把变量n的地址赋给pn cout<<m<<endl; cout<<*pm<<endl; cout<<n<<endl; cout<<*pn<<endl; getchar(); }
对指针变量的初始化,有如下两种方式:
• • • • • • • • • • • • (1)直接地址赋值。例如: int count=0; int*p; p=&count; (2)动态申请内存。这种初始化指针变量的方式采用C++ 的new运算符来动态申请空间。new运算符的语法是: <指针变量名>=new<数据类型>; 或者 <指针变量名>=new<数据类型>[<元素个数>]; 其中: 指针变量名:任何合法的指针变量名; 数据类型:任何合法的C++基本类型或自己定义的类; 元素个数:可以使用new运算符一次申请多个指定数据 类型的空间
执行后输出及说明:

第8章 指针

第8章 指针

8.3指针变量的运算
8.3.3指针的关系运算
• 程序分析如下: • (1)定义整型变量a,a表示学号;定义指针 变量p,p表示传达室。 • (2)变量a的地址赋值给p。 • (3)从键盘输入一个整数存入变量a中。 • (4)通过指针变量p输出a变量的值。
• • • • • • • • •
#include<stdio.h> main() { int a,*p; p=&a; printf(“请输入一个整数学号:\n”); scanf(“%d”,&a); printf("%d\n",*p); }
&a &b q
a 6 8 b
8.3指针变量的运算
8.3.3指针的算术运算
5.指针运算 (1)两个指针变量可以相减 • 如果两个指针变量都指向同一个数组中的 元素,则两个指针变量值之差是两个指针 之间的元素个数 (2)指针变量加(减)一个整数 例如:p++,p--,p+i,p-i,p+=i,p-=i等均是指 针变量加(减)一个整数。
找到i的地址 2000,从而从存 储单元读取3
int i=3,j=6,k; k=i+j; 从这里取3 从这里取6
将9送到这里
直接存取
int i=3,j=6,k; 定义特殊变量i_pointer
i_pointer=&i;
*i_pointer=50;
50
将i的地址 存到这里
间接存取
Байду номын сангаас i
直接存取
2000
8.2变量的指针和指向变 量的指针变量
8.2.2指针变量初始化
• (1)将一个已经定义的变量的地址赋值 给指针变量。 • int i=5; • int *p=&i; /*将整形变量i的地址赋 值给整形指针p*/ • 上述语句等价于: • int i=5,*p=&i;

wincc指针变量的用法

wincc指针变量的用法

wincc指针变量的用法在WinCC中,指针变量是一种非常重要的数据类型,它允许我们在编程过程中更加灵活地处理内存地址。

本文将详细介绍WinCC指针变量的用法。

首先,让我们了解一下指针变量的概念。

指针变量实际上是一种存储内存地址的变量,它可以指向其他变量或对象的地址。

通过使用指针变量,我们可以直接访问和操作内存中的数据,在一些特定的应用场景下非常有用。

在WinCC中定义指针变量很简单,只需要在变量名前加上"*"符号即可,例如:int *p;上面的代码定义了一个名为p的指针变量,它可以指向int类型的数据。

需要注意的是,指针变量在定义时并不会分配实际的内存空间,而只是一个用来存储地址的变量。

接下来,让我们来看一下指针变量的赋值和访问。

通过赋值操作,我们可以将一个变量的地址赋给指针变量,从而使指针变量指向该变量。

例如:int a = 10;int *p = &a;上面的代码将变量a的地址赋给了指针变量p。

现在,通过*p可以访问到变量a的值,同时也可以通过p来修改变量a的值。

在使用指针变量时,需要注意一些细节。

首先,要确保指针变量在使用之前已经被正确初始化,不能使用未初始化的指针变量。

其次,要小心指针变量的指向,避免访问非法的内存地址,这可能会导致程序崩溃或者产生不可预料的错误。

另外,要注意指针变量的生命周期,避免在指针变量指向的对象被释放之后继续使用该指针变量。

除了基本的指针变量用法外,WinCC中还提供了一些与指针相关的操作符和函数,用于进一步扩展指针的功能。

例如,可以使用“->”操作符来访问指针所指向对象的成员,还可以使用malloc()函数动态分配内存空间,使用free()函数释放已分配的内存空间等。

在编写WinCC程序时,合理利用指针变量可以提高程序的效率和灵活性。

通过灵活运用指针变量,可以在一些需要动态管理内存或传递大量数据的情况下,更加高效地完成任务。

综上所述,本文对WinCC指针变量的用法进行了详细介绍。

计算机二级等级考试C语言关于指针的讲解

计算机二级等级考试C语言关于指针的讲解

如果有: 则内存情况如图8-1 如果有:int a=5;则内存情况如图 则内存情况如图 所示。 所示。 •a是存储单元(即变量)的名字, 是存储单元(即变量)的名字, • 5是存放在存储单元中的内容, 是存放在存储单元中的内容 是存放在存储单元中的内容, •存储单元的地址是2000。 存储单元的地址是 存储单元的地址 。
注意: 注意:
p++; /* 相当于 相当于p=p+1; */ 等价于*(p++) 特殊表达式: 特殊表达式: 不等价于(*p)++ *p++; 和 *p--; 先取用对象(*p),然后 自加减 自加减1 先取用对象( ,然后p自加减 ++*p;与 *++p; 完全相同 与 --*p;与*--p;完全相同 , 与 完全相同 这四种形式都是p先自加减 ,然后再取用对象 这四种形式都是 先自加减1,然后再取用对象 先自加减
本章考点
指针与指针变量的概念。 指针与指针变量的概念。 指针变量的运算。 指针变量的运算。 一维数组的地址、指向一维数组的指针及其应用。 一维数组的地址、指向一维数组的指针及其应用。 二维数组的地址、指向二维数组的指针及其应用。 二维数组的地址、指向二维数组的指针及其应用。 指针数组的概念及其应用。 指针数组的概念及其应用。 用指针表示字符串。 用指针表示字符串。 指针变量作为函数参数。 指针变量作为函数参数。 指向指针的指针变量及其应用。 指向指针的指针变量及其应用。 命令行参数的基本概念。 命令行参数的基本概念。
b[i] &b[i][0] 代表第 行0列元素的地址 代表第i行 列元素的地址 列元素的地址.
b b+1 b+2 则:b *b *(b+i)

指向数组的指针

指向数组的指针
类型说明符表示了返回的指针值所指向的数据类型。
如: int *ap(int x,int y)
{
......
}
表示 ap 是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
下例中定义了一个指针型函数 day_name ,它的返回值指向一个字符串。
该函数中定义了一个静态指针数组 name 。 name 数组初始化赋值为八个字符串,
#include <stdio.h>
main(){
int i;
char *day_name(int n);
printf("input Day No:\n");
scanf("%d",&i);
if(i<0) exit(1);
printf("Day No:%2d-->%s\n",i,day_name(i));
"Sunday"};
return((n<1||n>7) ? name[0] : name[n]);
}
在C语言程序设计中,无论规模多大的程序及复杂性如何,最终都要落实到每个小型函数的编写工作上。因此,C语言程序设计的基础工作是
函数的设计和编号,掌握C语言函数的特点及函数调用时参数变化的情形,无疑是一个很重要的编程基本技术。
如 int(*p)() 和 int *p() 是两个完全不同的量。 int(*p)() 是一个变量说明,
说明 p 是一个指向函数入口的指针变量,该函数的返回值是整型量,
(*p) 的两边的括号不能少。 int *p() 则不是变量说明而是函数说明,
说明 p 是一个指针型函数,其返回值是一个指向整型量的指针,

c语言面试题及答案2019

c语言面试题及答案2019

c语言面试题及答案2019C语言面试题及答案20191. 请解释C语言中的指针是什么?指针是一个变量,其值为另一个变量的地址。

在C语言中,指针可以指向任何类型的变量,包括整数、浮点数、数组、结构体等。

指针在内存中存储的是它所指向的变量的内存地址。

2. C语言中如何定义一个指针?在C语言中,定义一个指针需要使用星号(*)作为前缀。

例如,定义一个指向整数的指针可以写作:```cint *ptr;```这里,`ptr` 是一个指针变量,它可以存储一个整数的地址。

3. 解释C语言中的数组和指针的关系。

数组名在大多数情况下被用作指向数组第一个元素的指针。

例如,如果有一个数组 `int arr[10];`,那么 `arr` 可以被看作是一个指向 `arr[0]` 的指针。

4. C语言中如何声明一个指向指针的指针?指向指针的指针可以用于创建指向指针的指针变量。

声明方式是在指针声明的基础上再添加一个星号。

例如:```cint ptr_to_ptr;```这里,`ptr_to_ptr` 是一个指向指针的指针。

5. 什么是C语言中的函数指针?函数指针是指向函数的指针。

它可以存储函数的地址,并可以被用来调用函数。

声明函数指针的语法如下:```creturn_type (*ptr)(parameter_list);```其中 `return_type` 是函数的返回类型,`ptr` 是指针变量名,`parameter_list` 是函数参数列表。

6. C语言中如何使用函数指针?使用函数指针时,首先需要声明一个函数指针,然后可以将函数的地址赋值给该指针。

之后,可以使用指针调用函数。

例如:```cvoid func();void (*func_ptr)() = func;func_ptr(); // 调用函数```7. 解释C语言中的结构体是什么?结构体是一种用户自定义的数据类型,它允许将不同的数据类型组合成一个单一的数据结构。

C语言指针讲解

C语言指针讲解

float a;
int * pointer_1;
pointer_1=&a;
编辑课件
9
在对指针变量赋值时需要注意两点:
⑴ 指针变量中只能存放地址(指针),不要将一个 整数赋给一个指针变量。
例: * pointer_1=100; /* pointer_1是指针 变量,100是整数,不合法 */
(2) 赋给指针变量的变是量地址不能是任意的类型, 而只能是与指针变量的基类型具有相同类型的变 量的
编辑课件
22
可以用一个指针变量指向一个数组元素。
例如:int a[10]; (定义a为包含10个整型数据的数组)
int *p; (定义p为指向整型变量的指针变量)
p=&a[0]; (把a[0]元素的地址赋给指针变量p) 也就是使p指向a数组的第0号元素 。
编辑课件
23
编辑课件
24
10.3.2 指针的运算
编辑课件
29
(3) 用指针变量指向数组元素。
#include <stdio.h> void main() { int a[10];
int *p,i; for(i=0;i<10;i++)
scanf(″%d″,&a[i]); printf(″\n″); for(p=a;p<(a+10);p++)
printf(″%d ″,*p); }
{ void exchange(int *q1, int *q2, int *q3);
int a,b,c,*p1,*p2,*p3;
scanf(″%d,%d,%d″,&a, &b, &c);
p1=&a;p2=&b;p3=&c;
exchange (p1,p2,p3);

C51单片机指针变量的定义及应用

C51单片机指针变量的定义及应用

C51单片机指针变量的定义及应用一。

指针变量的定义指针变量定义与一般变量的定义类似,其形式如下:数据类型[存储器类型1]* [存储器类型2]标识符;[存储器类型1]表示被定义为基于存储器的指针。

无此选项时,被定义为一般指针。

这两种指针的区别在于它们的存储字节不同。

一般指针在内存中占用三个字节,第一个字节存放该指针存储器类型的编码(由编译时由编译模式的默认值确定),第二和第三字节分别存放该指针的高位和低位地址偏移量。

存储器类型的编码值如下:存储类型IIdata/data/bdataxdatapdataCode编码值0x000x010xFE0xFF[存储类型2]用于指定指针本身的存储器空间。

1、char * c_ptr;int * i_ptr;long * l_ptr;上述定义的是一般指针,c_ptr指向的是一个char型变量,那么这个char型变量位于哪里呢?这和编译时由编译模式的默认值有关,如果Menory Model—Variable—Large:XDATA,那么这个char型变量位于xdata区:如果Menory Model—Variable—Compact:PDATA,那么这个char型变量位于pdata 区:如果Menory Model——Variable——Small:DATA,那么这个char型变量位于data区。

而指针c_ptr,i_ptr,l_ptr变量本身位于片内数据存储区中。

2、char * data c_ptr;int * idata i_ptr;long * xdata l_ptr;上述定义,c_ptr,i_ptr,l_ptr变量本身分别位于data ,idata,xdata区。

3、。

指向函数的指针

指向函数的指针

指向函数的指针指向函数的指针变量的⼀般形式为:数据类型(*指针变量名)(函数参数表列);如: int (*p)(int ,int );1、int (*p)(int ,int );表⽰定义⼀个指向函数的指针变量p,它不是固定只能指向某⼀个函数。

在⼀个程序中,⼀个指针变量可以先后指向同类型的不同函数。

2、给函数指针赋值时,只须给出函数名⽽不必给出参数。

如: p=max;如果写成 p=max(a,b); 是将函数max(a,b);所得到的函数值赋给p,⽽不是将函数⼊⼝赋给p。

3、⽤函数指针变量调⽤函数时,只须将(*p)代替函数名即可。

如: c=(*p)(a,b);4、指向函数的指针变量,像p+n、p++、p--等运算是⽆意义的。

代码:输⼊两个整数,然后⽤户选择1或2,选1输出较⼤值,选2输出较⼩值。

程序代码:#include<stdio.h>void main(){int max(int ,int );int min(int ,int );int (*p)(int ,int );int a,b,c,n;printf("please enter a and b:");scanf("%d%d",&a,&b);printf("please choose 1 or 2:");scanf("%d",&n);if(n==1)p=max;else if(n==2)p=min;c=(*p)(a,b);printf("a=%d,b=%d,",a,b);if(n==1)printf("max=%d\n",c);elseprintf("min=%d\n",c);}int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}运⾏结果:实⽤价值在于在应⽤程序中常⽤菜单提⽰输出⼀个数字,然后根据不同值执⾏不同的功能,就是⽤此法。

C语言指针变量

C语言指针变量

C语言指针变量变量的指针就是变量的地址。

存放变量地址的变量是指针变量。

即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。

因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。

为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,例如,i_pointer代表指针变量,而*i_pointer 是i_pointer所指向的变量。

因此,下面两个语句作用相同:1.i=3;2.*i_pointer=3;第2个语句的含义是将3赋给指针变量i_pointer所指向的变量。

定义一个指针变量对指针变量的定义包括三个内容:1.指针类型说明,即定义变量为一个指针变量;2.指针变量名;3.变量值(指针)所指向的变量的数据类型。

其一般形式为:类型说明符*变量名;其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。

例如:1.int *p1;表示p1是一个指针变量,它的值是某个整型变量的地址。

或者说p1指向一个整型变量。

至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。

再如:1.int *p2; /*p2是指向整型变量的指针变量*/2.float *p3; /*p3是指向浮点变量的指针变量*/3.char *p4; /*p4是指向字符变量的指针变量*/应该注意的是,一个指针变量只能指向同类型的变量,如P3 只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。

指针变量的引用指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。

未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。

指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。

在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。

两个有关的运算符:∙&:取地址运算符;∙*:指针运算符(或称“间接访问” 运算符)。

字符串的指针和指向字符串的指针变量

字符串的指针和指向字符串的指针变量

10.4字符串的指针和指向字符串的指针在C语言中,既可以用字符数组表示字符串,也可用字符指针变量来表示;引用时,既可以逐个字符引用,也可以整体引用。

字符串在内存中的起始地址称为字符串的指针,可以定义一个字符指针变量指向一个字符串。

1.定义字符指针变量★char *ps1;ps1="form one";char *ps1="form one";★char str[ ]= "form one", *ps1;★ps1=str;注意:字符指针变量ps1中,仅存储串常量的地址,而串常量的内容(即字符串本身),是存储在由系统自动开辟的内存块中,并在串尾添加一个结束标志’\0’。

2. 引用1)逐个引用main(){ char *string="I am fine.";for(; *string!=’\0’; string++)printf("%c", *string);printf("\n");}2) 整体引用main(){ char *string="I am fine.";printf("%s\n",string);}程序说明:printf("%s\n",string);语句通过指向字符串的指针变量string,整体引用它所指向的字符串的原理:系统首先输出string指向的第一个字符,然后使string自动加1,使之指向下一个字符;重复上述过程,直至遇到字符串结束标志。

注意:其它类型的数组,是不能用数组名来一次性输出它的全部元素的,只能逐个元素输出。

3.字符指针变量与字符数组之比较虽然用字符指针变量和字符数组都能实现字符串的存储和处理,但二者有区别.(1)存储内容不同。

字符指针变量中存储的是字符串的首地址,而字符数组中存储的是字符串本身(数组的每个元素存放一个字符)。

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

一个指针变量可以指向整型变量、实型变量、字符类型变量,当然也可以指向指针类型变量。

当这种指针变量用于指向指针类型变量时,我们称之为指向指针的指针变量,这话可能会感到有些绕口,但你想到一个指针变量的地址就是指向该变量的指针时;这种双重指针的含义就容易理解了。

下面用一些图来描述这种双重指针,见图6-13。

在图中,整型变量i的地址是&i,将其传递给指针变量p,则p指向i;实型变量j的地址是&j,将其传递给指针变量p,则p指向j;字符型变量ch的地址是&ch,将其传递给指针变量p,则p指向ch;整型变量x的地址是&x,将其传递给指针变量p2,则p2指向x,p2是指针变量,同
时,将p2的地址&p2传递给p1,则p1指向p2。

这里的p1就是我们谈到的指向指针变量的指针变量,即指针的指针。

指向指针的指针变量定义如下:
类型标识符**指针变量名
例如:f l o a t**p t r;
其含义为定义一个指针变量ptr,它指向另一个指针变量(该指针变量又指向一个实型变量)。

由于指针运算符“*”是自右至左结合,所以上述定义相当于:
f l o a t*(*p t r);
下面看一下指向指针变量的指针变量怎样正确引用。

[例6-27]用指向指针的指针变量访问一维和二维数组。

#i n c l u d e
#i n c l u d e
m a i n()
{
i n t a[10],b[3][4],*p1,*p2,**p3,i,j;/是*p指3向指针的指针变量*/ f o r(i=0;i<10;i++) s c a n f("%d",&a[i]);/*一维数组的输入*/ f o r(i=0;i<3;i++) f o r(j=0;j<4;j++) s c a n f("%d",&b[i][j]);/*二维数组输入*/ f o r(p1=a,p3=&p1,i=0;i<10;i++) p r i n t f("M",*(*p3+i));/*用指向指针的指针变量输出一维数组*/ p r i n t f("\n");
f o r(p1=a;p1-a<10;p1++)/*用指向指针的指针变量输出一维数组*/
{
p3=&p1; p r i n t f("M",**p3);
}
p r i n t f("\n");
f o r(i=0;i<3;i++)/*用指向指针的指针变量输出二维数组*/
{
p2=b[i]; p3=&p2;
f o r(j=0;j<4;j++) p r i n t f("M",*(*p3+j));
p r i n t f("\n");
}
f o r(i=0;i<3;i++)/*用指向指针的指针变量输出二维数组*/
{
p2=b[i];
f o r(p2=b[i];p2-b[i]<4;p2++)
{
p3=&p2;
p r i n t f("M",**p3);
}
p r i n t f("\n");
}
}
程序的存储示意如图6-14所示,对一维数组a来说,若把数组的首地址即数组名赋给指针变量p1,p1就指向数组a,数组的各元素用p1表示为,*(p1+i),也可以简化为*p1+i表示。

同样,对二维数组b来说,b[i]表示第i行首地址,将其传递给指针变量p2,使其指向该行。

该行的元素用p2表示为*(p2+i)。

若作p3=&p2,则表示p3指向p2,用p3表示的二维数组第i行元素为:*(*p3+i)。

这与程序中的表示完全相同。

运行程序:
[例6-28]利用指向指针的指针变量对二维字符数组的访问。

#i n c l u d e #i n c l u d e m a i n()
{
i n t i; s t a t i c c h a r c[][16]={"c l a n g u a g e","f o x","c o m p u t e r","h o m e p a g e"}; /*二维字符数组*/ s t a t i c c h a r*c p[]={c[0],c[1],c[2],c[3]};指/*针数组*/ s t a t i c c h a r**c p p;/*指向字符指针的指针变量*/ c p p=c p;/*将指针数组的首地址传递给指向字符指针的指针变量*/ f o r(i=0;i<4;i++)/*按行输出字符串*/ p r i n t f("%s\n",*c p p++); p r i n t f("-----------\n");
f o r(i=0;i<4;i++)/*按行输出字符串*/
{
c p p=&c p[i]; p r i n t f("%s\n",*c p p);
}
}
程序中需要注意的是,执行cpp=cp是将指针数组的首地址传递给双重指针,所以*(cpp+i)表示第i行的首地址,而不是c p p+i。

在程序设计时一定分清。

相关文档
最新文档