C语言相关的指针以及一些问题的理解(2014-2-21)

发现这个问题,是在使用socket时使用的缓冲数组时,使用

char * buf不能够用于在recv函数中的buffer,必须改成char buf[LEN]才能用。这样子的原因是:使用指针来定义buf时,指针变量buf没有确定的值,谈不上指向某些变量(谭浩强C教材红色版本P243)。这种直接用指针变量代替数组会产生core dXX 的错误,进程直接down掉。其实挺好理解的:recv对buf进行写入,recv不知道buf有多长,能存储多少内容,而buf不知道recv要传进来多少内容。就会造成冲突。从对指针变量和数组这两种定义方式的内存分配机制方面来理解会更好些:当定义一个指针变量时,仅仅是开辟了保存指针变量的内存空间(通常就是只有一个字节);而在定义一个数组时(如:char buf[LEN]),其实是已经在内存中开辟了整个数组所需要的所有空间(1*LEN个字节)。

上述具体可以参考谭浩强C红色封面教材P264中所述以及例子:

char * a ;

scanf("%s",a);

会发出警告,提醒未给指针变量指定初始值(未指定其指向),这时候就会很危险:因为未确定指向的a可能是指向有用的内存数据段或者代码段,甚至是系统内存段,可能破坏程序甚至系统,造成严重后果。应该成:

char * a,str[10];

a = str;

scanf("%s",a);

这样才是正确的!




另外,声明的引用和指针的区别:在C的教材书上讲:变量名是对内容的引用,属于直接访问;而指针是通过地址找到内容,是间接访问。我想知道变量名也是通过变量名先找到存储内容的地址在找到内容的(谭浩强的C语言红色教材P220),这不是和指针是同样的东西吗?!奇怪~~

解答:上面表红部分应该是作者的笔误,可以这样子理解:引用其实就是一个地址的别名,变量名本身代表的就是那个地址的内容,引用是不需要另外开辟额外的空间来存储其与内容的对应关系的;而指针就是需要另外专门使用一个字节的空间来存储指针变量与地址的对应关系(也就是有一种特殊的变量叫做指针变量,如point是一个变量名,这个point代表的就是一个地址值的引用),这时*point才是代表存储内容。附带一下,&是取地址符。&一个变量名代表的是这个变量名代表的数值存放的地址。而,*则是取内容符,*一个指针变量名代表按照这个指针变量存储的地址找出该地址存储的内容。

有关指针和数组的赋值:

int * p = a;

int ** p = a;

对于第一行,是指将a数组的首元素地址赋给指针变量p;第二行,是指将a数组的首元素地址赋给指针变量*p,这时p内保存的内容是*p的地址,也就是p保存了存放了a首元素地址的指针变量的地址。


int *m,n;这行代表的是声明一个指向int的指针变量m,和一个int类型的变量n。



在C函数中传参传的是变量的COPY。如果使用数组名作为传入参数的话,在函数中改变了形参数组的数值,能够使得原本数组的相应数值发生改变。因为数组名就是指针。使用下标法进行改变形参数组元素时,其实就是直接改变实参数组中的元素,如:a[i]代表的就是*(p+i)。




转载于:https://my.oschina.net/DanielLee/blog/201948

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值