展开全部
首先您要理解内存模型。无论是一般的PC,或是手机、平板,暂时还离不开冯诺伊曼架构,内存有从零开始的编号。CPU可以通过这编号来访问内存的这个位置下的数据。
所谓指针,就是存储了这样一个编号。比如,在内存的第2396位置存储了一个整数29,则当您使用 int* p = (int*) 2396; 语句后,*p 便是29。一般的,任意变量都有一个地址,即其在内存中被存放的位置。
现在再来看未被赋值的指针。任何C++课本告诉我们,如果一个临时变量未赋值,则其值是不确定的。(究其底层,是因为函数运行在栈上,函数变量,也即局部变量,位置在栈上,而栈上的数据是不会被清除的,所以未赋值的变量内很可能是前一个或多个函数的某个变量的值,也可能是之前传递的参数、编译器添加的东西。一言以蔽之,曰“不确定”。)指针未赋值,本身其不确定,也就是您不知道它会指向什么地址,指向什么位置;说不定是个有效位置,说不定是个关键位置,说不定是空位置(比如,在内存只有x个“格子”的情况下访问第x号位置是无意义的,注意内存从0开始编号),说不定是禁止访问的位置(操作系统的核心位置)。回到您的问题,之所以kend可以访问,是因为kend暂时指向的位置是个有效位置,但照样可以看到data、next、pre的值是无意义的;而khead应该是指向了访问不了的位置(根据经验,大概率是0,即空指针)。
所谓指针,就是存储了这样一个编号。比如,在内存的第2396位置存储了一个整数29,则当您使用 int* p = (int*) 2396; 语句后,*p 便是29。一般的,任意变量都有一个地址,即其在内存中被存放的位置。
现在再来看未被赋值的指针。任何C++课本告诉我们,如果一个临时变量未赋值,则其值是不确定的。(究其底层,是因为函数运行在栈上,函数变量,也即局部变量,位置在栈上,而栈上的数据是不会被清除的,所以未赋值的变量内很可能是前一个或多个函数的某个变量的值,也可能是之前传递的参数、编译器添加的东西。一言以蔽之,曰“不确定”。)指针未赋值,本身其不确定,也就是您不知道它会指向什么地址,指向什么位置;说不定是个有效位置,说不定是个关键位置,说不定是空位置(比如,在内存只有x个“格子”的情况下访问第x号位置是无意义的,注意内存从0开始编号),说不定是禁止访问的位置(操作系统的核心位置)。回到您的问题,之所以kend可以访问,是因为kend暂时指向的位置是个有效位置,但照样可以看到data、next、pre的值是无意义的;而khead应该是指向了访问不了的位置(根据经验,大概率是0,即空指针)。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询