当前位置:文档之家› 指针习题

指针习题

指针习题
指针习题

指针习题

(1) 若有说明“int n=2,*p=&n,*q=p;”,则以下非法的赋值语句为。

A. p=q;

B. *p=*q;

C. n=*q;

D. p=n;

(2) 若程序已包含头文件stdio.h,以下选项中正确运用指针变量的程序段是。

A. int i=NULL;

B. float *f=NULL;

scanf("%d",i); *f=10.5;

C. char t='m',*c=&t;

D. long *L;

*c=&t; L='\0';

(3) 设有定义“int A,*pA=&A;”,以下scanf语句中能正确为变量A读入数据的是。

A. scanf("%d",pA);

B. scanf("%d",A);

C. scanf("%d",&pA);

D. scanf("%d",*pA);

(4) 已有定义:int i,a[10],*p;,则合法的赋值语句。

A. p=100;

B. p=a[5];

C. p=a[2]+2;

D. p=a+2;

(5) 有以下程序

main()

{ int x[8]={8,7,6,5,0,0},*s;

s=x+3;

printf("%d\n", s[2]);

}

执行后输出的结果是。

A. 随机值

B. 0

C. 5

D. 6

(6) 有以下程序

main()

{ int a[3][2]={0},(*ptr)[2],i,j;

for(i=0;i<2;i++)

{ ptr=a+i; scanf("%d",ptr); ptr++;}

for(i=0;i<3;i++)

{ for(j=0;j<2;j++) printf("%2d", a[i][j]);

printf("\n");

}

}

若运行时输入:1 2 3<回车>,则输出结果是 D 。

A. 产生错误信息

B. 1 0

C. 1 2

D. 1 0

2 0

3 0 2 0

0 0 0 0 3 0

(7) 有以下程序

void sort(int a[],int n)

{ int i,j,t;

for(i=0;i

for(j=i+1;j

if(a[i]

}

main()

{ int aa[10]={1,2,3,4,5,6,7,8,9,10},I;

sort(aa+2, 5);

for(i=0;i<10;i++) printf("%d,", aa[i]);

printf("\n");

}

程序运行后的输出结果是 C 。

A. 1,2,3,4,5,6,7,8,9,10,

B. 1,2,7,6,3,4,5,8,9,10,

C. 1,2,7,6,5,4,3,8,9,10,

D. 1,2,9,8,7,6,5,4,3,10,

(8) 若有以下定义和语句:

int s[4][5],(*ps)[5];

ps=s;

则对s数组元素的正确引用形式是 B 。

A. ps+1

B. *(ps+3)

C. ps[0][2]

D. *(ps+1)+3

(9) 有以下程序

main()

{ char str[]="xyz",*ps=str;

while(*ps) ps++;

for(ps--;ps-str>=0;ps--) puts(ps);

}

执行后输出结果是 C 。

A. yz

B. z

C. z

D. x

xyz yz yz xy

xyz xyz

(10) 下列选项中正确的语句组是 D 。

A. char s[8]; s={"Bei jing"};

B. char *s; s={"Bei jing"};

C. char s[8]; s="Bei jing";

D. char *s; s="Bei jing";

(11) 已定义以下函数

fun(char *p2, char *p1)

{ while((*p2=*p1)!= '\0') {p1++;p2++;}}

函数的功能是 A 。

A. 将p1所指字符串复制到p2所指的内存空间

B. 将p1所指字符串的地址赋给指针p2

C. 对p1和p2两个指针所指字符串进行比较

D. 检查p1和p2两个指针所指字符串中是否有'\0'

(12) 程序中若有如下说明和定义语句

char fun(char *);

main()

{ char *s="one",a[5]={0},(*f1)()=fun,ch;

}

以下选项中对函数fun的正确调用语句是 A 。

A. (*f1)(a);

B. *f1(*s);

C. fun(&a);

D. ch=fun*f1(s);

(13) 有以下程序

int *f(int *x, int *y)

{ if(*x<*y)

return x;

else

return y;

}

main()

{ int a=7,b=8,*p,*q,*r;

p=&a;

q=&b;

r=f(p,q);

printf("%d,%d,%d\n",*p,*q,*r);

}

执行后输出结果是 B 。

A. 7,8,8

B. 7,8,7

C. 8,7,7

D. 8,7,8

(14) 有以下程序段

main()

{ int a=5,*b,**c;

c=&b;b=&a;

}

程序在执行了“c=&b;b=&a;”语句后,表达式**c的值是 C 。

A. 变量a的地址

B. 变量b中的值

C. 变量a中的值

D. 变量b的地址

(15) 设有以下定义和语句

int a[3][2]={1,2,3,4,5},*p[3];

p[0]=a[1];

则*(p[0]+1)所代表的数组元素是 C 。

A. a[0][1]

B. a[1][0]

C. a[1][1]

D. a[1][2]

(16) 有以下程序

point(char *p){p+=3;}

main()

{ char b[4]={'a', 'b', 'c', 'd'},*p=b;

point(p); printf("%c\n",*p);

}

程序运行后的输出结果是 D 。

A. a

B. b

C. c

D. d

#include

main(int argc,char *argv[])

{ int i,len=0;

for(i=1;i

len+=strlen(argv[i]);

printf("%d\n",len);

}

程序编译连接后生成的可执行文件是exe1.exe,若运行时输入带参数的命令行是:ex1 abcd efg 10<回车>

则运行的结果是 D 。

A. 22

B. 17

C. 12

D. 9

(18) 对于基类型相同的两个指针变量之间,不能进行的运算是 C 。

A. <

B. =

C. +

D. -

(19) 若有说明int (*p)[3],则以下叙述正确的是 B 。

A. p是一个指针数组

B. p是一个指针,它只能指向一个包含3个int类型元素的一维数组

C. p是一个指针,它可以指向一个一维数组中的任一元素

D. (*p)[3]与*p[3]等价

(20) 若有以下程序

main()

{ int a,*pa;

char b,*pb;

printf("%d,%d",sizeof(pa),sizeof(pb));

}

则在32位机下的输出结果是 D 。

A. 4,1

B. 4,4

C. 1,4

D. 2,2

(21) 若有语句组“int a,*p=&a;*p=a;”则下列说法正确的是 C 。

A. 两条语句中的“*p”含义完全相同

B. 语句“*p=&a;”和“p=&a;”的功能完全相同

C. 语句“*p=&a;”的作用是定义指针变量p并对其初始化

D. 语句“*p=a;”是将a的值赋予变量p

(22) 以下程序

main()

{ int a[4][4]={{10,2,3,4},{51,6,7,8},{9,10,11,12},{1,14,15,16}};

int (*p)[4];

p=a;

printf("%d",*(p+2)-*(p+1));

}

执行后输出的结果是 D 。

A. 41

B. 42

C. 1

D. 4

char *fun(char *p)

{ return (p); }

该函数的返回值是Bcbbacab 。

A. 无确切值

B. 形参p中存放的地址值

C. 一个临时存储单元的地址

D. 形参p自身的地址值

(24) 以下程序

main()

{ static char *a[]={"MORNING", "AFTERNOON", "EVENING"};

char **n;

n=a;

func(n);

}

func(char **m)

{ ++m; printf("%s\n",*m); }

执行后输出的结果是 C 。

A. 为空

B. MORNING

C. AFTERNOON

D. EVENING

(25) 若有以下的说明和语句,则在执行for语句后,*(*(pt+1)+2)表示的数组元素是 C 。

int t[3][3],*pt[3],k;

for(k=0;k<3;k++) pt[k]=&t[k][0];

A. t[2][0]

B. t[2][2]

C. t[1][2]

D. t[2][1]

(26) 以下程序

main()

{ static char a[]="ABCDEFGH",b[]="abCDefGh";

char *p1,*p2;

int k;

p1=a;p2=b;

for(k=0;k<=7;k++)

if(*(p1+k)==*(p2+k))

printf("%c",*(p1+k));

printf("\n");

}

执行后输出的结果是 B 。

A. ABCDEFG

B. CDG

C. abcdefgh

D. abCDefGh

(27) 若有以下的说明和定义

fun(int *c) {……}

main()

{ int (*a)()=fun,*b(),w[10],c;

……

}

则在必要的赋值之后,对fun函数的正确调用语句是 B 。

A. a=a(w);

B. (*a)(&c);

C. b=*b(w);

D. fun(b);

main()

{ char *s[]={"one", "two", "three"},*p;

p=s[1];

printf("%c,%s\n",*(p+1),s[0]);

}

执行后输出的结果是 C 。

A. n,two

B. t,one

C. w,one

D. o,two

(29) 以下程序

void fun(int *x,int *y)

{ printf("%d %d",*x,*y); *x=3; *y=4; }

main()

{ int x=1,y=2;

fun(&y,&x);

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

}

执行后输出的结果是 A 。

A. 2 1 4 3

B. 1 2 1 2

C. 1 2 3 4

D. 2 1 1 2

(30) 下列不合法的main函数命令行参数表示形式是 B 。

A. main(int a,char *c[])

B. main(int arc,char **arv)

C. main(int argc,char *argv)

D. main(int argv,char *argc[])

关于堆栈和指针(指针例子解释很好)

关于堆栈和指针 堆栈是一种执行“后进先出”算法的数据结构。 设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。 堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。 堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。 堆栈可以用数组存储,也可以用以后会介绍的链表存储。 下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。 #define MAX_SIZE 100 typedef int DATA_TYPE; struct stack { DATA_TYPE data[MAX_SIZE]; int top; }; 堆栈是系统使用是临时存储区域。它是后进先出的数据结构。 C++主要将堆栈用于函数调用。当函数调用时,各种数据被推入堆栈顶部;函数终止后的返回地址、传递给函数的参数、函数返回的结果以及函数中声明的局部变量等等。因此当函数A调用函数B调用函数C,堆栈是增长了,但调用完成后,堆栈又缩小了。 堆是一种长期的存储区域。程序用C++的new操作符分配堆。对new的调用分配所需的内存并返回指向内存的指针。与堆栈不同,你必须通过调用new明确的分配堆内存。你也必须通过调用C++的delete 操作符明确的释放内存,堆不会自动释放内存。 如果C++中的一个类是定义在堆栈上的,就使用"."开访问它的成员。如果是定义在堆上的,就使用"->"指针来开访问。但在,"->"操作符也可以用在堆栈上的类。 什么是指针? 和其它变量一样,指针是基本的变量,所不同的是指针包含一个实际的数据,该数据代表一个可以找到实

C语言中指针、数组和引用例子实例

一、指针:内容是指示一个内存地址的变量;类型是指示编译器怎么解释指针内容指向地址中的内容,以及该内存区域有多大; 例子: [cpp] int i = 0; int * pi = &i; printf(“pi = %x \n”, pi); // 打印pi的内容: 0x2000 printf(“*pi= %d \n” , *pi); // 打印pi指向地址中的值: 5 printf(“&pi= %x \n”, &pi); // 打印pi的地址: 0x100 从汇编的角度来看,指针是这样的: int i = 0; 010E139E mov dword ptr [i],0 int * pi = &i; 010E13A5 lea eax,[i] 010E13A8 mov dword ptr [pi],eax 二、数组:是一个单一数据类型对象的集合。其中单个对象没有被命名,通过索引访问。 数组名和指针的区别:数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组。数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量。指向数组的指针则是另外一种变量类型,仅仅意味着数组的存放地址 注意:虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改,如下:天骄无双:https://www.doczj.com/doc/0f11180036.html, [cpp] int intArray[10]; intArray++; // 错误 “指针和数组等价”说的是什么?索引操作相同,例如:p[2]; a[2]; 三、引用(reference)是一个对象的别名。用对象初始化引用后,对象的名字和引用都指向该对象; 引用是如何实现的?从汇编语言的角度来看,指针和引用是一样的: [cpp] int i = 0; 00E9139E mov dword ptr [i],0 int & ref = i; 00E913A5 lea eax,[i] 00E913A8 mov dword ptr [ref],eax int * pi = &i; 00E913AB lea eax,[i] 00E913AE mov dword ptr [pi],eax 指针和引用的区别(从C++使用角度来看): 不存在空引用 引用要初始化 引用初始化后,不能指向另一个对象 这是由编译阶段保证的。 备注:一个指向非常量的引用不能用字面值或者临时值初始化;但是一个指向常量的引用可以。天骄无双:https://www.doczj.com/doc/0f11180036.html,

C语言数组指针的小例子

1、功能:输入6个学生的5门课程成绩,计算出每个学生的平均分和每门课程的平均分。 2、C语言实现代码:(其实就是用二维数组来实现的,二维数组的引用传递使用数组指针来完成) 复制代码代码如下: #include <stdio.h> #define STUDENT 5 #define SCORE 6 void input_array(float (*score)[STUDENT]); void avg_score(float (*score)[STUDENT]); void avg_course(float (*score)[STUDENT]); /** * calculate student average score and course average socore. */ int main(){ float a[SCORE][STUDENT]; input_array(a); avg_course(a); avg_score(a); } void input_array(float (*score)[STUDENT]){ int i, j; for(i=0; i<SCORE; i++){ printf("input the %d student score:", i+1); for(j=0; j<STUDENT; j++){ scanf("%f", score[i] + j); } } } void avg_course(float (*score)[STUDENT]){ int i,j; float s; for(j=0; j<STUDENT; j++){ printf("course%d ", j); } printf("n"); for(i=0; i<SCORE; i++){ s=0; for(j=0; j<STUDENT; j++){ printf("%f ", *(score[i] + j)); s += *(score[i] + j); }

c语言指针GetMemory经典例子

GetMemory的典型例子 2010-01-13 18:24 520人阅读评论(2) 收藏举报//NO.1:程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地址,*str为NULL中的值为0),调用函数的过程中做了如下动作:1申请一个char 类型的指针p,2把str的内容copy到了p里(这是参数传递过程中系统所做的),3为p指针申请了100个空间,4返回Test函数.最后程序把字符串hello world拷贝到str 指向的内存空间里.到这里错误出现了!str的空间始终为NULL而并没有实际的空间.深刻理解函数调用的第2步,将不难发现问题所在! void GetMemory(char *p) { p = (char*)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } //请问运行Test函数后会是什么样的结果? //NO.2:程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做了如下动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"hello world"了么?当然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数调用还要进行一步操作,也就是释放内存空间.当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西. char *GetMemory(void) { char p[] = "hello world"; return p;

c语言指针例子

深入理解c语言指针的奥秘 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3]; (5)int*(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文章<<如何理解c和c ++的复杂类型声明>>。 指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型: (1)int*ptr;//指针的类型是int* (2)char*ptr;//指针的类型是char* (3)int**ptr;//指针的类型是int** (4)int(*ptr)[3];//指针的类型是int(*)[3] (5)int*(*ptr)[4];//指针的类型是int*(*)[4] 怎么样?找出指针的类型的方法是不是很简单? 指针所指向的类型

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。 从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如: (1)int*ptr;//指针所指向的类型是int (2)char*ptr;//指针所指向的的类型是char (3)int**ptr;//指针所指向的的类型是int* (4)int(*ptr)[3];//指针所指向的的类型是int()[3] (5)int*(*ptr)[4];//指针所指向的的类型是int*()[4] 在指针的算术运算中,指针所指向的类型有很大的作用。 指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。 指针的值,或者叫指针所指向的内存区或地址 指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。 指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。 以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里? 指针本身所占据的内存区 指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。 指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。

指针 教案

《指针》教学设计 课题指针学科C语言奥赛授课人 课时两课时年级高一 学情分析 上节课已经学习了函数,函数中有以数组作为形参传递,在此部分中,已经初步认识了地址的概念。学生来自不同的班级,接受能力有所区别;编程能力与水平也有差异。 教学目标1.学生深刻理解地址的概念; 2.学生知道变量地址的概念,能说出不同变量的地址; 3.学生理解变量内容的概念; 4.学生知道如何去引用一个变量的地址; 5.学生能说出指针变量的概念,并比较出指针与指针变量两个概念的区别与联系; 6.学生能较为熟练的使用指针,包括指针变量的定义与操作; 7.学生能说出*与&运算符的关系; 8.学生能理解数组的定义后在内存中的空间分配与赋值操作; 9.学生能够理解指针变量的操作,对其它变量的影响; 10.学生能编写出指针作为形参的函数; 11.学生了解当指针被赋值数组的地址时的操作; 教学内容分析指针作为C语言的一大特色,与其他语言区别开来,第一是必学内容,而也是每年信息奥赛初赛的必考题目内容;指针同时还是C语言实现函数返回多个值与改变实参的唯一方式;指针且是后面学习内容:文件操作、结构体的基础,而结构体又是之后数据结构的基础,因此指针的基础性作用不言而喻。 教学重点1、学生能较为熟练的使用指针,包括指针的定义与操作; 2、学生能说出*与&运算符的关系; 3、学生了解当指针被赋值数组的地址时的操作; 4、学生能够理解指针变量的操作,对其它变量的影响; 5、学生能编写出指针作为形参的函数;

教学难点1、地址的理解; 2、&与*运算符的关系; 3、学生了解当指针被赋值数组的地址时的操作; 4、学生能够理解指针变量的操作,对其它变量的影响; 5、学生能编写出指针作为形参的函数; 教学 方法 问题教学法、讲授教学法、演示教学法、比较教学法、任务驱动 教学 环境 多媒体教室(一人一机)、投影仪、计算机广播控制系统、Dev c++ 4.9、课件等 教学过程教师活动学生活动设计意图 提出现实概念,类比讲解1、提出现实生活中的街道; 2、提出程序中的内存; 3、内存与街道的对比: 内存?街道储存单元?房子地址?门牌号 4、具体讲解地址概念; 积极思考, 一起类比学习 使用现实生活 中概念,类比讲 解抽象概念,突 破难点! 讲解变量地址概念1、模拟当一个变量定义后,为其分配储存单元; 2、强调不同类型变量,地址的不同; 3、提问:已定义的int i与double f它们的地址是多少? 4、提出变量地址概念:系统分配给变量的内存单元的起始地 址 学生与老师一 起观察计算机 为变量分配空 间规律,并回答 具体变量地址, 最终总结出变 量地址概念。 以问题引导方 式,集中学生注 意力,提升学生 总结能力,并加 深学生对变量 地址的概念的 印象。 讲解变量 内容1、模拟为变量赋值后的内存行为; 2、形成变量的第二属性:变量内容; 与老师一起将 熟悉的内容进 行一个更准确 的定义 演示学生熟悉 的操作,但揭示 熟悉的操作背 后的深层次内 容:变量内容的 赋值;

VB调用指针教程与实例

VarPtr 得到的内存地址 ObjPtr 是得到对象入口地址 StrPtr 字符串地址 呵呵有什么用呢?看到下面的文章相信你会有很大的收获的:) 题目:真没想到VB也可以这样用之指针技术 作者:不详,向作者致敬 来源:网络 想当年东方不败,黑木崖密室一战,仅凭一根绣花针独战四大高手,神出鬼没,堪称天下武林第一高手。若想成 为VB里的东方不败,熟习VB《葵花宝典》,掌握VB指针技术,乃是不二的法门。 欲练神功,引刀……,其实掌握VB指针技术,并不需要那么痛苦。因为说穿了,也就那么几招,再勤加练习,终可 至神出鬼没之境。废话少说,让我们先从指针的定义说起。 一、指针是什么?

不需要去找什么标准的定义,它就是一个32位整数,在C语言和在VB里都可以用Long类型来表示。在32位Windows 平台下它和普通的32位长整型数没有什么不同,只不过它的值是一个内存地址,正是因为这个整数象针一样指向一个 内存地址,所以就有了指针的概念。 有统计表明,很大一部分程序缺陷和内存的错误访问有关。正是因为指针直接和内存打交道,所以指针一直以来 被看成一个危险的东西。以至于不少语言,如著名的JAVA,都不提供对指针操作的支持,所有的内存访问方面的处理 都由编译器来完成。而象C和C++,指针的使用则是基本功,指针给了程序员极大的自由去随心所欲地处理内存访问, 很多非常巧妙的东西都要依靠指针技术来完成。 关于一门高级的程序设计语言是不是应该取消指针操作,关于没有指针操作算不算一门语言的优点,我在这里不

讨论,因为互联网上关于这方面的没有结果的讨论,已经造成了占用几个GB的资源。无论最终你是不是要下定决心修 习指针技术《葵花宝典》,了解这门功夫总是有益处的。 注意:在VB里,官方是不鼓励使用什么指针的,本文所讲的任何东西你都别指望取得官方的技术支持,一切都要 靠我们自己的努力,一切都更刺激! 让我们开始神奇的VB指针探险吧! 二、来看看指针能做什么?有什么用? 先来看两个程序,程序的功能都是交换两个字串: 【程序一】: '标准的做法SwapStr Sub SwapStr(sA As String, sB As String) Dim sTmp As String sTmp = sA: sA = sB: sB = sTmp End Sub

解析实用C语言编程中指针赋值的实例

解析C语言编程中指针赋值的实例 从const int i 说起 你知道我们声明一个变量时象这样int i ;这个i是可能在它处重新变赋值的。如下: int i = 0;/* . . . */i = 20; /*这里重新赋值了*/ 不过有一天我的程序可能需要这样一个变量(暂且称它变量),在声明时就赋一个初始值。之后我的程序在其它任何处都不会再去重新对它赋值。那我又应该怎么办呢?用const 。 /* . . . */const int ic =20;/* . . . */ic = 40; /*这样是不可以的,编译时是无法通过,因为我们不能对const 修饰的ic重新赋值的。*//*这样我们的程序就会更早更容易发现问题了。*//* . . . */ 有了const修饰的ic 我们不称它为变量,而称符号常量,代表着20这个数。这就是const 的作用。ic是不能在它处重新赋新值了。 认识了const 作用之后,另外,我们还要知道格式的写法。有两种: const int ic = 20; 与 int const ic = 20; 它们是完全相同的。这一点我们是要清楚。总之,务必要记住const 与int哪个写前都不影响语义。有了这个概念后,我们来看这两个家伙:

const int *pi 与 int const *pi 按普通的逻辑看,它们的语义有不同吗?呵呵,只要记住一点:int 与const 哪个放前哪个放后都是一样的,就好比const int ic;与int const ic;一样。也就是说,它们是相同的。 好了,我们现在已经搞定一个“双包胎”的问题。那么 int *const pi; 与前两个语句又有什么不同呢?下面就来具体分析它们的格式与语义吧。 先来说说const int *pi是什么作用(当然int const *pi也是一样的,前面我们说过,它们实际是一样的)。看下面的例子:#include stdio.hmain(){ /* 代码开始*/ int i1 = 30; int i2 = 40; /* 现在pi 变量的内容为i1 的内存地址*/ const int *pi = i1; /* 注意这里,pi可以在任意时候重新赋值一个新内存地址*/ /* pi 变量的内容为i2 的内存地址*/ pi = i2; /* 想想看:这里能用*pi = 80来代替吗?当然不能!*/ i2 = 80; printf(%dn, *pi); /* 输出是80 */ /* 代码结束*/} 语义分析: 看出来了没有,pi的值是可以被修改的。即它可以重新指向另一个地址的,但是,不能通过*pi来修改i2的值。这个规则符合我们前面所讲的逻辑吗?当然符合了。

《C++程序设计案例教程》C++指针练习题

指针练习题 一、选择题 1. 阅读下面程序,执行后的结果为() # include “stdio.h” void fun ( int *a , int *b ) { int k=5; *a = k ; *b = *a + k ; } main( ) { int *a , *b, x = 10 , y = 15 ; a= &x ; b = &y ; fun ( a , b ); printf ( “%d,%d\n”, *a , *b ) ; } A) 10,15 B) 5,15 C) 5,10 D) 15,10 2.以下选项中,不能正确赋值的是() A) char s[ ] = “china” ; B) char s[10 ] ; s1[ ]= “china” ; C) char *s = “china” ; D) char *s[4] = “china\n” ; 3. 设有以下定义: int a[4][3]= {1,2,3,4,5,6,7,8,9,10,11,12}; int(*prt) [3] = a ,*p=a[0]; 则下列能够正确表示数组元素a[1][2]的表达式是() A) * ( (*prt+1) [2] ) B) *(*(p+5))C) (*prt+1) +2 D) *(p+5) 4.已知: int a[6], *p = a ; 则下列不能表示a[1]地址的表达式是( ) A) p+1 B) ++p C) a+1 D) a++ 5. 以下程序的运行结果是( ) # include “stdio.h” main( ) { int a[ ]={1,2,3, 4,5,6,7,8,9,10,11,12}; int *p=a+5; *q=NULL; *q=*(p+5); printf(“%d %d\n”,*p,*q ); }

C语言程设计实验与案例周信东主编实验八 指针

实验6 指针 学号:1700200224姓名:莫新锋实验日期: 一、实验目的和要求 (1)掌握指针的概念、指针变量定义和引用。 (2)掌握指针的运用方法。 (3)掌握数组的指针和指向数组的指针变量。 (4)掌握指针与函数的关系。 (5)能正确使用字符串的指针和指向字符串的指针变量。 (6)了解指向函数的指针。 (7)了解指向指针变量的指针的概念及其使用方法。 二、实验内容 完成实验指导书中的实验八“基础部分”和“增强部分”的题目。 实验九的内容由同学自行选作。 三、实验步骤及结果 【基础题】:Ex8-1请在下面分别插入改正错误后的源程序代码及运行成功时的画面源程序代码: 请在此粘贴修改后正确的程序代码。、 #include //#define N 12 void main() { int j, a[12],*p=a; //p=&a[N]; for(j=1;j<=12;j++) scanf("%d",p); for(j=1;j<=12;j++) { printf("%d",p++); if(j%4==0) printf("\n"); }

} 运行结果: 请在此粘贴本程序运行结果的截图 Ex8-2请在下面插入该程序的运行结果的画面:运行结果: #include swap(int *pl,int *p2) { int p; p=*pl; *pl=*p2; *p2=p; } void main() { int n1,n2,n3; int *p1,*p2,*p3; printf("Input n1,n2,n3: ");

scanf("%d,%d,%d",&n1 ,&n2,&n3); p1=&n1; p2=&n2; p3=&n3; if (n1>n2) swap(p1,p2); if (n1>n3) swap(p1,p3); if(n2>n3) swap(p2,p3); printf("The result is:%d %d %dn",n1,n2,n3); } 请在此粘贴本程序运行结果的截图 试用解释本程序是如何通过指针参数p1、p2改变主函数main中的变量n1、n2、n3的值的? 请回答问题 将n1,n2,n3的地址分别给p1,p2,p3,通过对n1,n2,n3两两的比较,调用函数swap进行排序,进而得到新的地址排序后输出 【增强题】:Eh8-1请在下面分别完成本题的源程序代码及运行结果的画面:源程序代码: 请在此粘贴完成本题的程序源代码。 #include void main()

指向指针的指针实例.

指向指针的指针实例 关键字:指针 我们想在函数pro()中改变指针p的值(记住:是指针p的值,而不是p所指向的地址的值)。能实现吗?结果是不能,为什么?我们来分析一下 先看一个例子: #include char buf[10] = "hello"; void pro(char *out) { out = buf; } main() { char *p = NULL; pro(p); printf("%s\n", p); } 我们想在函数pro()中改变指针p的值(记住:是指针p的值,而不是p所指向的地址的值)。能实现吗? 结果是不能,为什么?我们来分析一下。 如果不用函数pro(),我们可以直接在主函数中用 p = buf 来实现。如果使用函数pro(),就变得稍微复杂了。 因为我们要在函数pro()中改变指针p的值,而函数pro()又没有返回值,如何记住这个改变呢? 我们可以先用简单的例子说明: #include void pro(char *out) { out[1] = 'o'; } main() {

char *p = "hello"; pro(p); printf("%s\n", p); } 这个例子是改变了字符串指针p所指向的字符串的指,它能记住这个改变是因为在函数中是对指针所指向的地址 空间进行操作。你明白了吗?也就是说,函数的参数是char *out,我们可以改变 *out,但改变不了out本身。 所以针对第一个例子,我们要想改变p,必须把&p当作参数传给函数pro()。修改后的例子如下: #include char buf[10] = "hello"; void pro(char **out) { *out = buf; } main() { char *p = NULL; pro(&p); printf("%s\n", p); }

实验8 指针的应用

实验八指针的应用(2学时) 实验前必须做的操作 ...... .........—— ..新建文件夹: 首先在各自对应的计算机ncre(k:)盘上对应座位号文件夹内新建一个文件夹,文件夹的名字为“班级+学号的后两位+姓名”,如座位号为K02,航海1111班、学号后两位是02的、姓名为“张强”的同学,则其对应的文件夹名字是:航海111102张强。然后在刚才建好的文件夹里面再建立一个文件夹,文件夹为“实验8”。 【实验目的】 1、掌握指针的概念、指针变量定义格式; 2、掌握指针的运算; 3、学会用指针对变量进行操作; 4、掌握指针与数组的关系; 5、了解通过指针操作字符串的方法; 6、了解指针与函数的关系; 7、了解指向指针变量的指针。 【实验内容】 [实验任务一]:补充完整程序,掌握C语言中与指针有关的算法。 程序填空实例8-1:使用指针把从键盘输入的2个数按从大到小的顺序输出(不改变变量的值),请补充完整并上机调试。将填空后完整的程序以文件名为blank8_1.c保存在实验8文件夹里。(需要存盘) 第 1 页共10 页

第 2 页 共 10 页 程序填空实例8-2:输入10个整数存入一维数组,再按逆序重新调整该数组中元素的顺序然后再输出。下面给出部分程序的内容,请将程序补充完整,然后上机调试。 将填空后完整的程序以文件名为nixu_1.c 保存在实验8文件夹里。 (需要存盘) 将填空后完整的程序以文件名为nixu_1.c 保存在实验8文件夹里。 (需要存盘 )

程序填空实例8-3:用指针访问简单变量。从键盘输入三个整数,要求设三个指针变量p1,p2,p3,使p1指向三个数的最大者,p2指向次大者,p3指向最小者,然后按由小到大的顺序输出这三个数。将填空后完整的程序以文件名为blank8_3.c保存在实验8文件夹里。(需要存盘) 程序填空实例8-4:用指针来处理一维数组元素。从键盘上输入若干个字符,以符号“@”结束。编一个C程序,统计这些符号的个数(不包括@)存入数组元素a[0],将这些符号依次存入a[1]、a[2]、a[3]、…中。接着利用a[0]中存放的字符个数,输出这些字符。将填空后完整的程序以文件名为blank8_4.c保存在实验8文件夹里。(需要存盘) 【待填充的源程序参考清单】 #include void main( ) { char a[100]={0}, =a, c; scanf ("%c", &c); while( ) { ; ; *pa=c; scanf("%c", &c); } printf("\nnumber of string: %d\nstring:\n", a[0]); for(pa=a+1; pa<= ;pa++) printf("%c",*pa); printf("\n"); } 第 3 页共10 页

C 指针数组的使用例子

C++指针数组的使用例子 在C++语言中,数组元素全为指针的数组称为指针数组 // 0220.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int arr[]={1,2,3,4,54}; //第一种 for(int i=0;i<5;i++) { printf("%d\t",arr[i]); } printf("\n"); //第二种 for(int i=0;i<5;i++) { printf("%d\t",*(arr+i));//不可用i++ }

printf("\n"); //第三种 int *p1=&arr[0]; for(int i=0;i<5;i++) { printf("%d\t",*p1); p1++; } printf("\n"); //第四种 int *p2=&arr[0]; for(int i=0;i<5;i++) { printf("%d\t",*(p2+i)); } printf("\n"); //第五种 int *p22=arr; for(int i=0;i<5;i++) { printf("%d\t",p22[i]); //指针可以当作数组来操作

//第六种;通过指针复制不同类型的数组 printf("\n"); char arr1[]={255,255,255,254, 255,255,255,255}; int arr2[]={1,1}; int *p3=(int*)arr1;//把arr1强制转换成int型使arr1指针偏移与arr2一致以便通过指针复制数值 int *p4=arr2; //这个强制类型转换实质就是为了同步两个数组的偏移量!!!! for(int i=0;i<2;i++) { *(p4+i)=*(p3+i); } for(int i=0;i<2;i++) { printf("%x",*(p4+i)); } printf("\n"); return 0;

相关主题
文本预览
相关文档 最新文档