C语言学习——指针的一些常见问题

1.什么是指针?指针的类型和指针指向的类型的区别?什么是指针的值?

指针是变量,系统为指针分配内存空间,指针内部存的值是特殊值–地址。

指针的类型意思是 这个指针是什么数据类型的指针;

指针指向的类型是访问所指向的内存空间时,指针所指向的类型,两者概念不同。

指针的值是指针所指向的内存区或地址。

2.p和*p分别对应什么?p++和 *p++又分别表示什么?

p对应p对应的内存空间,*p对应p指向的 内存空间。p++是地址进行加法, *p++是p指向的内存空间的值加1.

3.什么是常量指针?什么是指针常量?二者的区别是什么?

常量指针是指向一个常量的指针,本质上是指针;指针常量是指针本身是一个常量,指针的地址不能修改,但是指针所指向的内存o'o?

4.字符0表和数字0的区别是什么?

字符0表示,这个0是一个字符,在程序里面的表示方法是‘0’,数字0是一个整形数字0,类型是int型,\0是空字符。用ascll值来表示的话,字符0是48,数字0和\0,ascll是0。

5.strlen和sizeof的区别?

strlen是求字符串的长度,一定只能是字符串,测量字符数组的长度时,不能用strlen;sizeof是求数据类型所占内存空间的大小,以字节为单位。

6.空指针的用法?

1.在定义指针时用到,用于防止野指针。

2.用于做返回值。

3.用作警戒值。

7.字符串处理函数的参数必须是字符串吗?可以是字符地址吗?

有些字符串处理函数的参数可以是地址,这意味着可以是字符地址,例如strcpy,第一个参数必须是字符串,但是第二个参数就只要求是地址。具体用法可以用man+函数名 来查询。

8.右左法则的用法?

先从变量开始,先向右看,然后向左看;当遇到括号时就转移方向,括号内的所有内容分析完毕就跳出括号。遇到)或者[或者;就意味着是函数,数组和变量,遇到*就意味着是指针。

9.指针的长度是多大?用sizeof来计算不同类型的指针结果是什么?长度与什么有关?

由于指针的值是地址,这就与操作系统的位数有关,在不同的操作系统下,指针的长度不同,在32位操作系统是4个字节,在64位是8个字节。用sizeof来计算不同类型的指针结果都相同,是一个定值4或8(结果与操作系统有关)。

10.*实质上是什么算法?&实质上是什么算法?

* 是取值的算法, 例如 * p就是取出p所对应的内存空间的值。&是取出变量的地址。&ch,就是取出字符型变量ch的地址。1指针是变量还是常量。

指针是变量,这样指针就有了变量的特性。

1)系统为指针分配内存空间;

(2)指针有自己的地址;

(3)指针能够存值,但这个值比较特殊——地址。

11、指针的值的含义:

内存区域或地址。指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区域就是从指针值所代表的那个内存地址开始,长度为sizeof的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX位首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

12、空指针如何使用?

1)用空指针终止对递归数据结构的间接使用。

(2)用空指针进行函数调用失败时的返回值。

(3)用空指针作警戒值。

13、指针的算术运算:

第一种形式是:指针 + (-) 整数

标准定义这种形式只能用于指向数组中的某个元素的指针,这类表达式的结果类型也是指针。

数组的元素存储于连续的内存位置中,后面元素的地址大于前面元素的地址,因此,对一个指针+ 1 使他指向下一个元素,+5 使他向右移动5 个元素的位置,以此类推,把一个指针- 3 使他向左移动3个元素的位置。

第二种形式是:指针 - 指针

只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针。两个指针相减的结果的类型是 ptrdiff_t,他是一种有符号的整数类型。减法运算的值是两个指针在内存中的距离,因此减法运算的结果将除以数组元素类型的长度。

14、NULL总是被定义为0吗?

NULL不是定义为0,就是被定义为“(void *)0”,这两种值几乎是相同的。当程序中需要一个指针时(尽管编译程序并不是总能只是什么时候需要一个指针),一个纯粹的0或者一个void指针都能自动被转换成所需要的任何类型的指针。

15、指针函数和函数指针是什么

函数指针:即指向这个函数的指针,定义为“数据类型*(*fun)(参数列表);”,()的优先级比*高,所以*fun加括号,如“void(*fun)(int* , int*);”

指针函数:即返回值是指针的函数,定义为“数据类型*fun(参数列表);”,如“char* fun(int* , int*);”,即返回值为char*型。

16、右左法则是什么?

右左法则能让你准确理解所有的声明。从变量名开始阅读声明,向右看然后向左看。当碰到一个括号时就调转阅读的方向,括号内的所有内容都分析完毕就跳出括号的范围。这样继续,直到整个声明都被分析完毕。

17、.函数参数如何传递?

1)值传递:把实参的值传递给形参。

2)指针传递:指针传递时形参值的改变并不能改变实参的值,但形参所指向内容值的改变却能改变实参,这一点非常的重要,是指针传递的精华所在。

18、常用的字符串函数:

strlen(char *str); //获取字符串长度,字符串结束符NULL不计算在内

strcat(char *str,char *ptr); //将ptr接到str后面

strnact(char *str,char *ptr,2); //将ptr的前两个字符添加到str后

strcpy(char *str,char *ptr); //将ptr复制到str所指定的位置,包含NULL strncpy(char *str,char *ptr,nu); //将ptr的前nu个字符复制到str所指定的位置

一上便是总结的指针常见问题,觉得不错不妨关注一下,我会不定期更新常C语言相关知识,让我们一起学习。

另外有一个学习群 三八九零六一三一六 编号:落叶。资料齐全,也有各路大佬坐镇,想要学习的同学欢迎加入,让我们一起学习。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180306A15VD100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券