C语言指针基础

C语言指针

前导程序

#include<stdio.h>

void change(int *);

int main()

{

int a=90;

change(&a);

printf("a=%d\n",a);

return 0;

}

void change(int *n)

{

*n=10;

}

一、基本知识点

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的和与差(一个函数返回两个值)

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

#include<stdio.h>

int SumAndMinus(int n1,int n2,int *n3)

{

 *n3=n1-n2;

 return n1+n2;

}

int main()

{

 int a=10;

 int b=11;

 int sum;

 int minus;

 sum=SumAndMinus(a,b,&minus);

 printf("和=%d,差=%d\n",sum,minus);

}

五、有关指针的疑问

注意:任何类型的指针都占据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-09-05 01:57:08

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

基础-关于C语言指针相加问题

问题描述 关于C语言指针相加问题 代码: include main(){ int a , *p; a = 3 ; p = &a ; int *q = p + 1; printf("p is %d",p); printf("q is %d",q); printf("*q is %d",*q); } 运行结果: p is 2293308q is 2293312*q is 2293312 Process exited after 0.1425

《51单片机应用开发范例大全(第3版)》——第1章 单片机C语言开发基础 1.1 MCS-51单片机硬件基础

第1章 单片机C语言开发基础 单片微型计算机(Single Chip Micro Computer)现已正名为微控制器(MCU,Micro Controller Unit),单片机的称谓只是其习惯称呼.它把组成微型计算机的各功能部件(包括中央处理单元CPU.随机存储器RAM.只读存储器ROM.I/O接口电路.定时器/计数器以及串行口等)集成在一块电路芯片上.由于单片机的硬件结构与指令系统的功能都是按工业控制要求而设计的,因此常用在工业检测.控制装置中. 1.1 MCS-51单片机硬件基础 MCS

c语言-有关C语言指针的传递问题

问题描述 有关C语言指针的传递问题 int i = 3 ; int *p ; p = &i ; int *q = p; 问题:先定义一个数值为3的变量 i .然后把i的地址传递给变量p.那么变量p的内存单元中存储的就是i的地址,假如说是2000,那么p就是2000. *p就是间接访问i,也就是说*p是3. 再定义一个变量q.*q也是间接访问的数值,这里等于p,也就是说*q 是2000. 我的理解是内存中存在一个变量,里面存的是2000.那么我如果输出q.那么就应该是 内存中数值为2000的这个变

C语言指针入门学习面面观_C 语言

这似乎是一个很凝重的话题,但是它真的很有趣. 1. 指针是指向某一类型的东西,任何一个整体,只要能称为整体就能拥有它自己的独一无二的指针类型,所以指针的类型其实是近似无穷无尽的 2. 函数名在表达式中总是以函数指针的身份呈现,除了取地址运算符以及sizeof 3. C语言最晦涩难明的就是它复杂的声明: void (*signal(int sig, void (*func)(int)))(int),试试着把它改写成容易理解的形式 4. 对于指针,尽最大的限度使用const保护它,无论是传递给函数,

Oracle PL/SQL语言入门基础_oracle

正在看的ORACLE教程是:Oracle PL/SQL语言入门基础.PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件.以及如何设计并执行一个PL/SQL程序. PL/SQL的优点 从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL

无线标记语言(WML)基础之WMLScript基础

WML Script是属于无限应用协议WAP应用层的一部分,使用它可以向WML卡片组和卡片中添加客户端的处理逻辑,目前最新的版本是1.1版.WML Script1.1是在欧洲计算机制造商协议会制定的ECMAScript脚本语言的基础上,经过修改和优化而指定的.它能够更好的支持诸如移动电话类的乍带宽通信设备,在WML编程中使用WML Script可以有效的增强客户端应用的灵活性,而且,我们也可以把WML Script作为一个工具使用,开发出功能强大的WAP网络应用和无限网页.本章我们将详细讲解WM

C语言指针使用方法

为初学者服务.这是本文的宗旨.指针是c和c++中的难点和重点.有些程序员们精通dos下的basic.c语言的其它各种特性,在basic中都有类似的东西.只有指针,是baisc所不具备的.指针是c的灵魂. 我不想重复大多数书上说得很清楚的东西,我只是把我看过的书中说得不清楚或没有说,而我又觉得我理解得有点道理的东西写出来. 1.指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指

Swift与C语言指针结合使用实例

  这篇文章主要介绍了Swift与C语言指针结合使用实例,本文讲解了用以输入/输出的参数指针.作为数组使用的参数指针.用作字符串参数的指针.指针参数转换的安全性等内容,需要的朋友可以参考下 Objective-C和C的API常常会需要用到指针.Swift中的数据类型都原生支持基于指针的Cocoa API,不仅如此,Swift会自动处理部分最常用的将指针作为参数传递的情况.这篇文章中,我们将着眼于在Swift中让C语言指针与变量.数组和字符串共同工作. ####用以输入/输出的参数指针 C和Obj

c语言-新人,C语言,指针,帮我看看怎么改好吗?

问题描述 新人,C语言,指针,帮我看看怎么改好吗? #include void sort(int *a); main(void) { int i,a[10]; float sum=0.0; int *p; p=a; printf("输入10个数n"); for(i=0;i<10;i++) { scanf("%d",p++); } p=a; sort(p); printf("最大值为%d,最小值为%dn",*p,*p+9); for(i=0;