如何正确地使用C语言的指针
发布网友
发布时间:2022-04-23 09:15
我来回答
共1个回答
热心网友
时间:2022-05-02 10:04
指针是C语言中的精髓,它能直接对物理地址进行访问,具有双重功能,是嵌入式设计中必不可少的一门语言。C语言功能强大的主要原因就是具有指针结构。指针是一种特殊的数据类型,直接指向目标的存储地址,实现直接访问对象存储空间的功能。
1、指针指向变量:
下面有这样一个代码块:
int main()
{int a=10;int b=15;test(a,b);printf("a=%d,b=%d\n",a,b);}
void test(int x,int y)
{int tmp;tmp=x;x=y;y=tmp;}
最后输出的结果还是a=10,b=15。因为在函数调用时,实参和形参之间只是值传递。但我们使用指针结果就不一样了,如:
int main()
{int a=10;int b=15;test(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;}
void test(int * x,int *y)
{int tmp;tmp=*x;*x=*y;*y=tmp;}
输出结果a=15,b=10。变量a和b的值发生了交换。这是因为我们利用指针访问变量的存储单元,间接修改变量的值。
2、指针指向数组:
定义一个数组并初始化,int array[5]={2,5,12,7,8},定义一个指针变量并把数组的地址赋给它,int *p=array,注意数组名就是数组的地址,而且数组的地址就是首元素的地址。因此我们的指针变量就指向了数组的首元素,*p=2。如果把(p+1),那么指针变量就指向了数组的下一个元素5,因此我们可以利用指针来遍历数组的各个元素:
int main()
{int array[5]={2,5,12,7,8};int *p =array;for(int i=0;i<5;i++){printf("array[%d]=%d\n",i,*(p+i));}return 0;}
3、指针指向字符串:
我们都知道用数组存储字符串,如char name[20]="jack",上面已经简单讲述了指针指向数组,所以我们可以这样做,char *name="jack",指针变量指向字符串的首个字符并可以依次访问字符串的各个字符。
4,指针指向函数:
我们需要知道怎样表示一个指针指向函数,说白了就是语法要正确,下面我也取一个代码块来说明一下:
int sum(int x,int y)
{return x+y;}
int main()
{int a=5;int b=6;int (*p)(int,int);p=sum;int result=(*p)(a,b);printf("The result is %d\n",result);return 0;}
不难发现上面代码块里语句(*p)(a,b)可以用p(a,b)来代替,因为p和sum就是一样的,只是用前者可能更容易理解一点。而我们要知道怎样定义一个指针指向函数,int (*p)(int,int)这是固定写法,前面的int是指针将来指向的函数的返回值的类型,如果没有函数返回值,那就是void,后面括号里的两个int 当然就是指针将指向的函数的形参。指针指向函数用起来确实有点抽象,要想熟练运用的话就多去做一些这方面的练习吧!
5,指针指向结构体:
我们首先首先定义一个结构类型,
struct student
{
char *name;
int ages;
};
再根据类型定义结构体变量 struct student stu={"Rose",15};定义一个指针指向结构体类型,struct student *p;把结构体变量stu的地址赋给指针变量p,p=&stu;我们可以有3种方式来访问结构体中的属性ages:
stu.ages=15;(*p).ages=15;p->ages=15;不过第三种方式在C语言中只能用来指向结构体。
综上所述,指针的基本用法就是这几种,还有些用法不常见的在此就一一例举了,有兴趣的话可以去翻阅相关的资料。
c语言指针知识点总结
1)指针一定要初始化,否则容易产生野指针(后面会详细说明);2)指针只保存同类型变量的地址,不同类型指针也不要相互赋值;3)只有当两个指针指向同一个数组中的元素时,才能进行指针间的运算和比较操作;4)指针只能进行减法运算,结果为同一个数组中所指元素的下标差值。(2)指针的本质分析 ①指针...
C语言指针怎么用?
在c语言中.指针被用来表示内存单元的地址,如果把这个地址用一个变量来保存,则 这种变量就称为指针变量。指针变量也分别有不同的类型,用来保存不同类型变量的地址。严格地说.指针与指针变量是不同的,为了叙述方便,常常把指针变量就称为指针。内存是计算机用于存储数据的存储器,以字节作为存储单元....
可以介绍一下c语言里面的指针怎么运用吗?
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。 从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如: (1)int*ptr;//指针所指向的类型是int (2)char*ptr;//指针所指向的的类型是char ...
C语言指针的用法是什么?
运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。同时,指针也...
c语言指针知识点总结
1. 指针的初始化和类型匹配 - 指针在使用前必须被初始化,以避免野指针的出现。- 指针只能存储同类型变量的地址,不同类型的指针之间不应进行赋值操作。2. 指针的运算和比较 - 只有当两个指针指向同一个数组中的元素时,指针之间的运算和比较才是有意义的。- 指针只能进行减法运算,其结果是两个...
急!!叙述对C语言指针的认识,在使用指针时应该注意什么问题? 谢谢大神...
int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.int p(int); //从P...
C语言的指针是什么
先声明几个指针放着做例子:例一:(1)int *ptr;(2)char *ptr;(3)int **ptr;(4)int (*ptr)[3];(5)int *(*ptr)[4];如果看不懂后几个例子的话,请参阅我前段时间贴出的文章 < <如何理解c和c++的复杂类型声明>>。1。 指针的类型。从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的...
c语言关于指针问题 int x=2,y=5,*px=&x,*py=&y;这个语句*px=&x正确么...
如果不是声明,而是语句:int x=2, *px; // 声明 变量 x, 初始化 x=2, 声明 px 是 指针 变量 px=&x; // 这里 是语句,这个语句 不正确。语句里要写:px = &x; // 把 x 的地址 赋给 px, 也就是 让 px 指向 x.接下来要是有语句:px = 5; // 这个语句正确, ...
c语言中指针的优先级是如何规定的?
1.指针所指地址自增 p++等同于*(p++)++p等同于*(++p)2.指针所指地址中数据自增 ++(*p)等同于++*p (*p)++ (左自增:先求变量变化,再输出)形式:++p、*++p、++*p、++(*p)、(右自增:先输出变量当前所指值,再求变量的变化)形式:p++、*p++、(*p)++、*(p++)哪个是变量:...
C语言指针什么时候要带*什么时候不带*?
1.声明的时候需要用*来表示声明的对象是一个指针。如:int* p;2.使用的指针的值的时候。如:printf("p = %d",*p);3.给指针赋值的时候。*p = 5;不带*的情况:1.使用指针的时候。如:int a = 0; p = &a;(p是int*)2.表示字符串首地址的时候不用*。如:char* ch = "hello"; ...