2016-08-03 10:00齐景宪 客户经理
区别:C语言把内存划分成四个区,它把一般的变量和数组等存在于内存中的栈区,所以数组在C语言的定义中只是一组同类型的普通变量,即使这个变量有可能是指针。所以他的作用比指针小的很多,而指针可以指向任何区的任何数据,所以就会觉得指针和数组名很像,但是必须要注意的是,数组名只是指针中的一种,它是指针中只指向栈区的且指针的移动范围是有限的,即数组长度。而且数组在定义之初就已经有了自己的内存,一般的指针如果未指向某一个内存块时,它是没有自己的内存的,即所谓的野指针。
联系:如上面所说,数组只是定义在栈区的一个连续变量,它的首地址就酣抚丰幌莶呵奉童斧阔是一个指针。
总结:不仅数组有指针,所有变量都有指针,指针说白了就是内存中的地址,就像一个房间必须有一个房间号。在C/C++语言中定义一个指针,就是在栈区开辟一个内存空间用来存放它指向的内存地址,然后给指针赋值,就是把地址值赋值给刚才开辟的内存空间,然后通过访问该内存中的地址值来间接访问该地址下存放的数据。如果该地址值指向的是一块静态存储区,如字符串常量等,当然就不可以修改指向的内容啦。
经验之谈,楼楼加分啊
2016-08-03 09:57赵骏凯 客户经理
楼主,其实,C语言里面只有变量和常量,根本没有什么指针,指针也是变量。变量是一个“名化”(就是有名字)的存储空间。一个变量具有二重属性,一是值,二是地址(物理地址,就是内存中的位置)。变量名与值绑定在一起,通过变量名我们可以访问存放在它所代表的这个存储空间里的值,可以把新的值放进它所代表的这个存储空间(同时原来的值被覆盖掉)。而变量的另外一个属性,地址,则是隐性的。C语言里面我们需要在变量名前面使用取地址运算符&来获取。比如说:
int a, b;声明了一个变氦筏份禾莓鼓逢态抚卡量,我们可以写a = 3(把3放进a所代表的存储空间里面),我们可以写b = a + 2;我们把a里面的值取出来加2后得到的值5放进b所代表的存储空间里面。如果我们想知道a所代表的存储空间到底在内存中的什么位置,那我们可以写 &a,这个时候&a就把a所代表的内存空间的位置,就是变量a的地址取出来了。由于内存里面每一个单元的地址是用正整数来标记的(就像座位编码1,2,3...号一样),所以地址也可以被当作值(正整数不就是值吗?)来看待,不妨假设&a=1024,既然地址是值,那我们就可以把它存到另外一个存储空间里面,我们写int * p = &a;正是此意。
楼主,你不妨记住我在这儿给你说的每一句话,尤其是开头的那两句,现在不明白不要紧,时候到了你自然会明白,到那时候你就知道此乃金玉良言!
2016-08-03 09:54黄盛权 客户经理
这个简单,首先你要明白,每一块内存都是有一个对应的地址编码的。你需要这么理解。
在内存里面除了存数据外,还会存内存的地址。比如 我们定义:int a=1;那么要开辟两个内存块:一个是存当整数1的,还有一个就是存放这个1的地址的。而指针就是地址。“*”其实有两种含义,一个定义的时候用,比如
int *p,这个的意思是标识这个P是一个指针。*p++里面的*是表示取p这个变量里保存的地址里面的数据。&是表示取变量的地址。不要把指针想的多难,你只要简单地知道内存是有地址编号的,而内存既能数据,也能存地址。
2016-08-03 09:48赵首永 客户经理
有时候需要将不同类型的数据组合成一个有机的整体,这些组合在一个整体中的数据是互相联系的,就用到结构体。
每个成员名前的类型标识符可以为已经定义了的任意类型,当然可以是结构体类型标识符,即结构体成员也可以是另一个结构体变量。
struct date
{
int year;
int month;
int day;
};
struct student
{ int num;
char name[20];
char sex;
struct date birthday;
char addr[30];
};
此处只是构造出一个新的类型,并没有定义该类型的变量,因此在内存中并没有开辟任何存储空间;
成员也可以是指向本结构体类型的指针变量;
struct student
{ int num;
char name[20];
float score;
struct student *next;
};
2016-08-03 09:45连伟杰 客户经理
在C语言中,任何一个变量总结起来包括变量的数据类型、存储空间。在数据类型中定义的变量的基本范围和操作类型。存储空间就是变量在计算机中的存储地址,如何有效的存储变量并能有效的访问到它这是一个必须解决的问题。指针籂矗焚匪莳睹锋色福姬就是表示地址的一种变量,所以指针的范围严格来说只能是自然数的,并且不能在两个指针间进行加、乘、除这样的运算。
2016-08-03 09:42路誉盛 客户经理
如果将指针变量指向一个已开辟过的,即已有的空间,就不需要重新开辟内存空间了,只有需要开辟的害怠愤干莅妨缝施俯渐时候才开辟内存空间
2016-08-03 09:39齐晓彤 客户经理
2.
char s2[]="string";中,s2是个指针常量,故不能再赋值,即C:s2="w"; 是错误的,*s2指向数组的第零个元素,是个字符,故D: *s2="w"; 是错误的,应该是*s2='w'; ,对char *s1="string"; ,s1是个指针变量,故可以重新赋值,故B: s1="w"; 是正确的,
1.
const出现在*号左边则该指针指向的位置的内容不可改变;const出现在*号右边则该指针指向的位置不可改变;对char *const s1="string"; ,s1不能重新赋值,故A: s1="w"; 是错误的,对char const *s2="string"; ,s2可以重新赋值,故C: s2="w"; 是正确的,
对1,2两题中剩余的选项,都犯了一个共同的错误,就是在定义一个指针变量(或指针常量)p时,系统仅仅为指针自己分配了存储空间,并没有像数组那样专门开辟了一个空间存放数据元素,故p只能指向一个常量的存储空间,即他所指向的数据是常量,其值不可改变;如果人工专门开辟一个空间,然后让p指向这个空间,这样存在于这个空间的数据才是可以修改的,如char p=(char)malloc(sizeof(char)),这时,*p=‘w'是正确的。
故答案是:1、C 2、B
你所说的答案是错误的,可以上机验证一下。