C语言指针基础

C语言指针

前导程序

 

 1 #include<stdio.h>
 2
 3
 4
 5 void change(int *);
 6
 7 int main()
 8
 9 {
10
11 int a=90;
12
13 change(&a);
14
15 printf("a=%d\n",a);
16
17 return 0;
18
19 }
20
21
22
23 void change(int *n)
24
25 {
26
27 *n=10;
28
29 }
30
31  

一、基本知识点

Int a=10;

Int *p;//定义一个int类型的指针

P=&a;//指针变量p指向了变量a

*p=20;//使用指针不通过变量直接修改变量a的值为20

*p表示访问指针变量p指向的存储空间

指针一个作用:能够根据一个地址值,访问(取值 | 赋值)对应的存储空间

指针变量p前面的int,表示指针的类型

①. Int *p;

②. *p=10;

两个*的区别:前一个起标识作用,表明定义的p是一个指针,后者的*表示通过访问p指向的地址空间

二、指针使用注意

①. Int *p;

double d=10.0;

p=&d;//不建议此种做法

②. Int *p;

p=200;//指针变量只能存储地址

③. Int *p;

printf(“%d\n”,*p);//指针变量未经初始化,不要拿来间接访问其他的存储空间

④. Int *p=&a;但是不能写成 int *p;*p=&a;这种写法没有任何的意义,可以认为*是和类型符一起使用的。

⑤. *是指针运算符,访问指针指向的空间

三、指向指针的指针

Int a=10;

Int *p=&a;//指向int型的指针

Int **p1=&p;//指向指针的指针

Int ***p2=&p1;//三级指针

*p2相当于访问p1;

**p2相当于访问p;

***p2相当于访问a;

*p1相当于访问p;

一颗星一条线。

四、指针练习

编写一个函数,计算a和b的和与差(一个函数返回两个值)

提示:指针的作用之一:实现让函数拥有多个返回值

 

1 #include<stdio.h>
 2
 3
 4
 5 int SumAndMinus(int n1,int n2,int *n3)
 6
 7 {
 8
 9    *n3=n1-n2;
10
11    return n1+n2;
12
13 }
14
15
16
17 int main()
18
19 {
20
21    int a=10;
22
23    int b=11;
24
25    int sum;
26
27    int minus;
28
29    sum=SumAndMinus(a,b,&minus);
30
31    printf("和=%d,差=%d\n",sum,minus);
32
33 }

五、有关指针的疑问

注意:任何类型的指针都占据8个字节的存储空间,那么为什么还要为指针加上类型呢?

对下面一段代码进行内存分析,可以证明指针类型不正确带来的严重后果。

Int i=2;

Char c=1;

Int *p=&c;//本应该是char类型的,写成了int类型

Printf(“c的值是%d\n”,*p);//打印结果为513,而非1

Printf(“c的值是%d\n”,c);//值为1

下面是上述代码的结果的内存分析:

指针p访问的本应该是1个字节空间的数据,此时因为指针的类型是int型的,因此程序自然的从指向的地址0x0a开始读取了4个字节的数据,访问的数据从1变成了513。

提示:明确了指针的数据类型,指针才能够正确的访问应该访问的空间数据。

六、指针和数组

Int ages[5]={10,9,8,7,6};

遍历数组

For(int i=0;i<5;i++)

Printf(“%d\n”,ages[i]);

使用指针遍历数组

Int *p;

P=ages;//也可以写成p=&ages[0];,指针变量p指向了数组的首元素

元素的地址:

第一个元素的地址p    &ages[0]

第二个元素的地址p+1    &ages[1]

第三个元素的地址p+2    &ages[2]

元素的值

*p        ages[0]

*(p+1) ages[1]

*(p+2) ages[2]

把指针当做数组来用:

For(int i=0;i<5;i++)

Printf(“%d\n”,*(p+i));

  (1)数组元素的三种访问形式:

①. 数组名[下标]

②. 指针变量名[下标]

③. *(p+1)

(2)指针变量的+1究竟是加多少?这取决于指针的类型,如果是char类型则加1个字节,如果是int类型的,则加4个字节。

  (3)利用指针来接收一个数组,指针变量指向了数组的首元素。

Void change(int array[])等价于void change(int *array)。

前者存储的虽然是数组元素的首地址,但是在传递时就已经变成指针了。

示例:

Void change(int *array)

{

//Printf(“%d\n”,array[2]);

Printf(“%d\n”,*(array+2));

}

Int main()

{

Int ages[5]={1,2,3,4,5};

Change(ages);

}

调用的结果为:数组的第三个元素3

若改给change(&ages[2]);则调用的结果为5,因为此时array指向的是ages[2],把ages[2]当做了array的首元素

七、指针和字符串

(一)基础知识

下面两行代码有着本质的区别:

①. Char name[]=“it”;

②. Char *name2=“it”;//指针变量name2指向了字符串的首字符i

Char name[0]=‘y’;//改变第一个元素的值

Printf(“%s\n”,name);//打印结果为yt

*name2=‘y’;

Printf(“%s\n”,name2);//此时程序崩溃

这是因为,两者一个是字符串变量,一个是字符串常量。C语言的数组元素存放于栈,里面的元素可以随便修改,称为字符串变量。而字符串常量存放于常量区,会缓存起来是不可更改的。

Char *name1=“it”;

Char *name2=“it”;

Printf(“%p %p”,name1,name2);//地址是一样的,说明name1和name2指向的是同一个字符串。

掌握字符串定义的两种方式:

①. 利用数组

特点:字符串里边的字符是可以修改的,适用于内容需要经常修改时。

②. 利用指针

特点:其实是一个常量字符串,里面的字符不能修改,适用于字符串的内容不需要修改,且这个字符串经常被使用时。

(二)指针数组

整型数组:这个数组中存放的都是整型数组

指针数组:这个数组中存放的都是指针

Int ages[5];

Char *name[5]={“jack”,“rose”,“yang”};//字符串数组的常见写法

对应于:

Char name2[3][10]={“jack”,“rose”,“yang”};

保存字符串数组的两种方式:

①. 指针数组(字符串数组)

②. 二维字符数组(字符串数组)

如何输入字符串?(使用数组——因其可变)

Int main()

{

Char name[20];

Printf(“请输入姓名:\n”);

Scanf(“%s”,name);

Printf(“%s”,name);

}

八、返回指针的函数

程序示例:

#include<stdio.h>

Char *test();

Int main()

{

Char *name=test();

Printf(“name=%s\n”,name);

Return 0;

}

Char *test() //返回指针的函数

{

Return “rose”;

}

九、指向函数的指针

数组名即数组的地址,函数名即函数的地址。

假设有函数:

Void Test ()

{

Printf(“调用了test函数\n”);

}

Void (*p)();  //void指针变量指向的函数没有返回值,()表示p指向的函数没有形参

P=test; //有指针p,把指针p指向函数

有三种方式可以操纵函数:

①. 直接调用test();

②. 利用指针变量简介调用  (*p)();

③. 简化使用p()

练习:

假设有函数声明为 int sum(int a,int b)

则相对应的指向该函数的指针应该定义为:int (*p)(int ,int);

把指针变量p指向函数:p=sum;

调用该函数的三种方式:

(1)int c=p(10,12);

(2)Int c=sum(10,12);

(3)Int c=(*p)(10,12);

假设函数声明为:double haha(double a,char *b,int c);

则定义一个指向haha函数的指针应该为:double (*p)(double,char *,int)=haha;

时间: 2024-08-08 17:29:31

C语言指针基础的相关文章

C语言 指针基础篇 数组,函数与指针的运用 2 14

下面看看如何在函数中运用指针吧 下面是往函数传入指针的简单操作,不是传入数组的.判断一个a是否大于b是的话给,是的话对其进行操作,不是的话就直接返回. 1 #include <stdio.h> 2 int main(){ 3 int num1,num2,*p1,*p2; 4 p1 = &num1,p2=&num2; 5 scanf("%d%d",&num1,&num2); 6 7 int fun(int *n1,int *n2); //我们在

没事抽空学——c语言指针操作基础概念

指针基础 理解指针的最佳方法是画图,学习使用基本指针,不要产生空指针. 存储控件分配 存储控件分配是指在内存预留空间的过程.就像一个虚拟菜谱一样,指针对应菜名,其所指的内存空间中的数据对应实际的菜. 数据集合与指针的算术运算 数据集合主要指结构和数组.指针的算术运算定义指针的计算规则.指向结构的指针对于建立数据结构起着至关重要的作用.在c中,数组和指针一样,都是以指针算术运算方法进行运算的. 作为函数参数的指针 通过这种方式,可以按照传递应用的方法传递函数参数.在c语言中,传递数组或大型结构时,

C语言之指针基础概念

开通博客园以来第一次写随笔,就写一下关于C语言指针的一些感想吧. 很多同学都搞不懂指针,我一开始也云里雾里没看懂指针,而且老师又把指针说得很难的样子.其实主要是把指针”*“的作用给弄混了,不用畏惧,细心点看就可以了. 首先简介一下指针的概念好了.指针本身也是一个变量,只不过这个变量的值比较特殊,它不是常规的整型数或者浮点数,而是指向另一个变量地址的值.通过指针的值可以知道另一个变量的地址以及存在该地址中的具体数值(该数值可以是整型,浮点型,结构体,甚至也可以是一个指针),通过指针得到另一个变量的

C语言--&gt;(十)指针基础

知识点: 1.指针基础 2.指针和函数(地址传递) ======================================= 指针是C中的一个重要的概念,也是C的一个重要特色.掌握指针的应用,可以使程序简洁.紧凑.高效. 指针的概念比较复杂,使用也比较灵活,因此初学时会常出错,我们要理解每一个概念的本质,多加练习,在实践中掌握它. 程序使用指针和没有没有使用指针的代码是两个档次. ========================================指针基础 [地址概念] 1.生

2.C#1语言核心基础

C#1语言核心基础 本部分将重点讨论C#1语言中的几个核心基础,他们包括:委托.类型系统.值/引用类型 1.委托 委托类似与函数指针,是要在恰当的时间执行的一系列操作,如果代码想要执行操作,但不知道操作细节,就可以使用委托. 简单委托的构成 要执行一个委托必须满足一下4个条件 申明委托类型 创建一个方法包含要执行的代码 创建一个委托实例 调用委托实例 合并和删除委托 上面的例子委托实例都只是一个操作,但是真实情况要稍微复杂一些,委托实例实际有一个操作列表与之关联,这就是调用列表. System.

黑马程序员_C语言总结-基础部分

C语言基础 1.C语言的关键字 1>关键字就是C语言提供的有特殊含义的符号,也称为保留字,C语言中一共有32个关键字,这些关键字都有自己的含义 例如:int double float if  else switch for 等等 2.标示符的概念: 1>标示符就是在程序中自定义的一些名称,比如函数名,变量名,结构体名等等这些都是标示符 2>命名规则: 1>只能由英文字母的大小写和数字以及_下划线组成,且首字母必须为字母或者下划线_ 2>在C语言中是严格区分大小写的,比如if是

c语言指针学习

前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水,食品,你能告诉还有没有问题的吗?不知大难至,世人依旧忙.祸福相依,危中有机.那些高级生命,出于慈悲,会救渡我们,但是你要去思考,去发现机缘. 最近较闲,没事就学点基础知识,整天在上层晃,感觉晕的厉害,接地气.关于指针我上学的时候学过一点,我的老师说"指针很难呢",当时以为这老师挺谦虚的.后

C语言02基础深入理解(二)

指针基础 变量回顾 既然程序中的变量只是一段存储空间的别名 , 那么是不 是必须通过这个别名才能使用这段存储空间 ? 指针本质 ?  指针在本质上也是一个变量 ?  指针需要占用一定的内存空间 ?  指针用于保存内存地址的值 * 号的意义 ?  在指针声明时 ,* 号表示所声明的变量为指针 ?  在指针使用时 ,*  号表示取指针所指向的内存空间中的值 // 指针声明 : int i = 0; int j = 0; int* p = &i; // 取值 : j = *p; p: 0xAABBCC

C语言零基础项目驱动式学习第一天

引言: 智能手机(Smart Phone)是一种运算能力及功能比传统手机更强的手机.目前的操作系统基本上有以下几种: 1. Symbian Os 众所周知塞班隶属于NOKIA,Symbian开发之初的目标是保证在较低资源的设备上能长时间的运行,这导致了塞班的应用程序开发有着较为陡峭的学习路线,开发成本高,但是程序的运行的效率很高> 2.Android 开源, 联盟,Android凝聚了几乎遍布全球的力量,这是Android形象及声音能够被传到全球移动互联网市场每一个角落的根本原因.不过, 1).