去年学C语言课时,初步了解了指针的概念,能看懂一些简单的含有指针的程序,但事实上对于指针并没有真正的弄明白它的使用,这点我在半年后的数据结构课程上才深刻的体会到和别人的差距。更加可怕的是,对于当时所得的一知半解,现在已经忘的八九不离十了,所以决定进行C语言核心部分的重修,巩固自己的基础。

1.什么是指针?

定义一个变量,系统会为它分配内存单元,内存区的每一个字节有一个编号,即“地址”。

我们可以通过地址找到所需的变量单元,即:地址指向该变量单元。而这个地址便被形象化的称为“指针”。即:一个变量的地址称为该变量的指针。

2.什么是指针变量?

定义一个变量,专门用它来存放另一个变量的地址,这个变量被称为指针变量。指针变量的值是地址(指针)。

3.指针变量的定义。

int *p;//类型名 * 指针变量名;

***注意:指针变量p前面的*,指针运算符,表示的是“指向”,表示该变量的类型为指针型变量。在定义指针变量时必须指定基类型。

int a,b;
int *p1,*p2;//定义两个指向int的指针变量p1,p2
p1=&a;//a的地址赋给指针变量p1
p2=&b;//b的地址赋给指针变量p2

***注意:&,取地址运算符,&a是变量a的地址。

4.指针变量的引用。

*p1=;//将100赋给p指向的变量,即变量a=100
printf("%d",*p1);//输出a的值
printf("%o",p1);//输出a的地址

***注意:*p1指,指针变量p1指向的变量,即整型变量a。

5.指针的使用。

例1:输入a和b两个整数,按先后大小的顺序输出a和b的值。

 #include <stdio.h>
int main()
{
int *p1,*p2,*p,a,b;
printf("请输入两个整数:");
scanf("%d,%d",&a,&b);//输入数字时一定要使用英文状态下的逗号,
p1=&a;
p2=&b;
if(a<b)
{
p=p1;
p1=p2;
p2=p;
}
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",*p1,*p2);
return ;
}

例2:swap()函数实现交换两个变量的值。

 int main()
{
void swap(int *p1,int *p2);
int a,b;
int *pointer_1,*pointer_2;
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
swap(pointer_1,pointer_2);//swap(a,b)是错误的
printf("a=%d,b=%d\n",a,b);
return ;
}
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;//传a值
*p1=*p2;//传b值
*p2=temp;
}

swap函数的两个形参p1和p2是指针变量,实参pointer_1和pointer_2也是指针变量,调用函数时,进行的是“值传递”。这个时候p1和pointer_1都指向a,p2和pointer_2都指向b,swap函数中,*p1和*p2的值互换,也就使a和b的值互换了。

***注意:C语言中实参变量和形参变量之间的数据传递是单向的“值传递”的方式。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。

例3:输入3个整数a,b,c,要求按从大到小的顺序将它们输出,并用函数实现。

 #include <stdio.h>
int main()
{
void exchange(int *q1,int *q2,int *q3);
int a,b,c,*p1,*p2,*p3;
printf("please enter three numbers:");
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;
p2=&b;
p3=&c;
exchange(p1,p2,p3);
printf("The order is:%d,%d,%d\n",a,b,c);
return ;
}
void exchange(int *q1,int *q2,int *q3)
{
void swap(int *pt1,int *pt2);
if(*q1<*q2) swap(q1,q2);
if(*q1<*q3) swap(q1,q3);
if(*q2<*q3) swap(q2,q3);
}
void swap(int *pt1,int *pt2)
{
int temp;
temp=*pt1;
*pt1=*pt2;
*pt2=temp;
}

函数的嵌套调用思维需要好好的积累和练习。

上述是指针的基本概念和简单应用,指针有很多灵活的使用,其中就包括指针和数组结合,指针和字符串结合的广泛使用。

C语言——什么是指针?的更多相关文章

  1. Swift3.0语言教程使用指针创建和初始化字符串

    Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例 ...

  2. C语言中的指针数组

    C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...

  3. 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化

    C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...

  4. GO语言中的指针

    http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...

  5. 由链表初始化看C语言的二级指针

    先来看C语言创建链表.插入节点和遍历链表的一段代码: #include <stdio.h> #include <stdlib.h> typedef int ElemType; ...

  6. C语言 > 数组和指针

    C语言 数组和指针 const: 关于指针和const需要注意一些规则.首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的. 然而,只能把非const数据的地 ...

  7. C语言结构体指针的引用问题

    在写栈的一个应用时遇见这样的一个问题 SqStack s; s->base = (int*)malloc(sizeof(int)*10); 通过这样一个代码引用的时候,会导致程序出现异常 经过一 ...

  8. Go语言基础之指针

    区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 Go语言中的函数传参都是值拷贝 ...

  9. c语言之函数指针应用

    c语言之函数指针应用 1.函数指针与指针函数 在开始运用函数指针前,我们需要将两个概念即:函数指针与指针函数搞清楚. 函数指针,指明这个一个函数,但返回值为指针类型,语法格式为: 类型名* 函数名A( ...

  10. C语言中的指针笔记

    C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...

随机推荐

  1. Elasticsearch之批量操作bulk

    1.bulk相当于数据库里的bash操作. 2.引入批量操作bulk,提高工作效率,你想啊,一批一批添加与一条一条添加,谁快? 3.bulk API可以帮助我们同时执行多个请求 4.bulk的格式: ...

  2. position中的absolute、fixed区别

    absolute: 绝对定位,相对于body.   fixed: 固定定位,相对于浏览器视窗,不随滚动条的滚动而滚动. 这两个属性概念比较模糊,一般在做左边列表菜单,右边内容区域的时候会用到这样的定位 ...

  3. javascript 核心概念(1)-数据类型

    语法 (1)到现在为止,大多数浏览器也还是支持到ECMAScript 第三版的标准. 核心概念就是一个语言的基本工作原理,涉及语法,操作符,数据类型. (2)javascript的一切--变量,函数名 ...

  4. canvas 和 svg

    对于开发人员而言,最直观的区别在于:1.对于画在Canvas上的部件,你需要处理重绘.而SVG则不用,你修改svg dom则系统会自动帮你重绘2.Hittest,即canvas不负责帮你侦测鼠标/触摸 ...

  5. Retrofit 传递json 和 复杂参数类型List<T>

    1 首先你要定义一个接口 @POST Call<String> post(@Url String url, @Body String info); 2 创建一个service public ...

  6. Eclipse的菜单简介

    在Eclipse工作台的上方提供了菜单栏,该菜单栏包含了实现Eclipse各项功能的命令,并且与编辑器相关,即菜单栏中的菜单项与当前编辑器内打开的文件是关联的.例如,编辑器内没有打开任何文件,那么,将 ...

  7. vs2017 创建项目推送到Git上

    地址 在从本地往云上推送的时候遇到了这样的问题 将分支推送到远程存储库时遇到错误: rejected Updates were rejected because the remote contains ...

  8. java Web(4)

    Web 应用程序状态管理 通过隐藏表单域 hidden,cookie,session,重写URL来实现: cookie存在于客户端,浏览器关闭时失效 cookie原理:服务器在响应请求时将一些数据以“ ...

  9. 51nod1085 背包问题【动态规划】

    在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整数),与之相对应的价值为P1,P2--Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数 ...

  10. [Ynoi2015]纵使日薄西山

    题目大意: 给定一个序列,每次单点修改,然后进行询问. 定义一次操作为,选择一个位置$x$,将这个位置的数和左边.右边两个位置的数(不存在则忽略)各减去1,然后和0取max. 对序列中最大的位置进行一 ...