c语言指针怎么理解,什么时候会用到指针,要注意哪些方面
8个回答
展开全部
cpu自己有运算器和寄存器,通过总线与存储器件相连,在坦厅执行运算时,
需要将数据冲存储器件上面将参与运算的数据读入,运算完成后再送出到
存储区。那么cpu读入时需要访问存储器件的某个单元,需要指定这个单元
的编号,我们管这个编号叫存储地址。
比如:int a[10],*p; p=&a[3];a就是一个拥有10个整型数据的数据区
的首地址,变量p是存放地址的,称为指针型变量,赋值时薯信搏需要取相应存储
区的地址,p=&a[3];就是取数组a的第4个单元的地址给p,那么p就拿到了
这个单元的地址,*p=5;就相当于a[3]=5;的操作,p++;后p指针就指向a[4]。
在操作大块数据时,一般记录首地址(数组指针),然后根据首地址再加
上偏移量来访问整个数据,在你程序中写a[3]时,计算机就会取a数组对应
的首地址再加3个整型偏移量来访问相应数据。用指针p访问a数组的好处
是,不用每次计算a加多少偏移访问数据,而是使p指向某数据后可以p++
或p--来访问前一个或后一个数据。
注意:
1.指针存放地址用,不是存储实际数据的,它是用来找数的,在
程序中要注意这点,往往出问题的是,指针还没有赋值就用来操作,或
用指针来存放数据,如:int *p=15,s[10]={ 0,15,{0} };的
p指针赋值有问题,这样计算机会把15当成地址存数祥放到p变量中,以后用
*p访问得到的数据就不是你想要的数据了。(应该类似:p=s+1; *p=15;)
2.指针访问数据区一般需要程序来控制不要越界,比如定义了10个单元
的数据区,你不能让指针超出这10个单元的范围,否则得到的数据就是
不靠谱的。
3.指针的定义只是开设了可以访问数据区或数组的变量,数据区和数组
需要你的程序另行开设,然后把数据区或数组的某个单元的地址赋值给
指针变量,不要认定义了能访问数组的指针,数组就定义好了。
4.指针存放的地址最好不要用来与其他地址比较,除非你能确认地址比
较的结果肯定是你想要的。
5.举例来说,int a[10],*p=a;中a和p都是指针(地址),但a和p是不同的
在编译器眼中,a是一个数据区的首地址,是一个标记,你程序中使用a
时,编译器会知道用数据区的首地址来替换操作,而p是你自己程序开
设的变量,可以在程序中操作比如p++; p=a;等,但作为记号的a就不能
在程序中操作了,如a++; a=p;就是错的了。
6.子程序如果参数是指针型的,这个参数由子程序开设的指针型临时
变量存储,这个临时变量可以进行操作,但不会返回给调用者的指针型
变量。
如:int a[10],*p; int f(int *s) { s++; } main() { p=a; f(p); }
s再怎么加减都不会影响p。
需要将数据冲存储器件上面将参与运算的数据读入,运算完成后再送出到
存储区。那么cpu读入时需要访问存储器件的某个单元,需要指定这个单元
的编号,我们管这个编号叫存储地址。
比如:int a[10],*p; p=&a[3];a就是一个拥有10个整型数据的数据区
的首地址,变量p是存放地址的,称为指针型变量,赋值时薯信搏需要取相应存储
区的地址,p=&a[3];就是取数组a的第4个单元的地址给p,那么p就拿到了
这个单元的地址,*p=5;就相当于a[3]=5;的操作,p++;后p指针就指向a[4]。
在操作大块数据时,一般记录首地址(数组指针),然后根据首地址再加
上偏移量来访问整个数据,在你程序中写a[3]时,计算机就会取a数组对应
的首地址再加3个整型偏移量来访问相应数据。用指针p访问a数组的好处
是,不用每次计算a加多少偏移访问数据,而是使p指向某数据后可以p++
或p--来访问前一个或后一个数据。
注意:
1.指针存放地址用,不是存储实际数据的,它是用来找数的,在
程序中要注意这点,往往出问题的是,指针还没有赋值就用来操作,或
用指针来存放数据,如:int *p=15,s[10]={ 0,15,{0} };的
p指针赋值有问题,这样计算机会把15当成地址存数祥放到p变量中,以后用
*p访问得到的数据就不是你想要的数据了。(应该类似:p=s+1; *p=15;)
2.指针访问数据区一般需要程序来控制不要越界,比如定义了10个单元
的数据区,你不能让指针超出这10个单元的范围,否则得到的数据就是
不靠谱的。
3.指针的定义只是开设了可以访问数据区或数组的变量,数据区和数组
需要你的程序另行开设,然后把数据区或数组的某个单元的地址赋值给
指针变量,不要认定义了能访问数组的指针,数组就定义好了。
4.指针存放的地址最好不要用来与其他地址比较,除非你能确认地址比
较的结果肯定是你想要的。
5.举例来说,int a[10],*p=a;中a和p都是指针(地址),但a和p是不同的
在编译器眼中,a是一个数据区的首地址,是一个标记,你程序中使用a
时,编译器会知道用数据区的首地址来替换操作,而p是你自己程序开
设的变量,可以在程序中操作比如p++; p=a;等,但作为记号的a就不能
在程序中操作了,如a++; a=p;就是错的了。
6.子程序如果参数是指针型的,这个参数由子程序开设的指针型临时
变量存储,这个临时变量可以进行操作,但不会返回给调用者的指针型
变量。
如:int a[10],*p; int f(int *s) { s++; } main() { p=a; f(p); }
s再怎么加减都不会影响p。
展开全部
指针是按一定规律操作大量的变量时用的,你想象如果你有一个数组,你要操作数组中一个特定元素高世,但是这个元素的下标是个变量,那你就离指针不远了,实际上指针名就是一个真正的数组名数蠢,要想纯熟得理解和运用指针,最好看看数戚毕肢据结构的书
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
c语言指针就是内存地址。既然是内存地址当然可以用它来访问内存。所明烂则以当你要对内存进行读、写或分配、释放的时激棚候会用到。甚至可以用函数指针来访问函数。要注意的东历困西一时说不全,这个需要自己实践总结。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-02-20
展开全部
个人理解
指针就是地址,不过这个地址是有类型的,比如一个int型的指针,int指的是该指针指向的那块内存存放的内容是一个int型的数据。
或者也可以把指针的类型亏余租简单的看毁举作是这个指针所能管到的销兆内存的大小,如一个int类型的指针可以管4个字节,char类型的可以管1个字节。
指针就是地址,不过这个地址是有类型的,比如一个int型的指针,int指的是该指针指向的那块内存存放的内容是一个int型的数据。
或者也可以把指针的类型亏余租简单的看毁举作是这个指针所能管到的销兆内存的大小,如一个int类型的指针可以管4个字节,char类型的可以管1个字节。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
就是数据的地址。 通过指针,可以向这个地址写入数据,或者读取数据。p是地址, *p就是地址的内容。
追问
那哪些地方会用到指针呢
追答
变量或函数都是有地址的。所有用到地址的就有指针。数据指针,数组指针,动态分配的空间地址指针,函数指针,结构指针, 参数传递等等,可以说所有的地方都用到了指针。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询