x=x+3;
看好了没,现在我问你:最终a值是多少,x值是多少?
(怎么搞的,给我这个小儿科的问题。还不简单,不就是a==4 x==7嘛!)
在这个代码中,你要明白一个东西:虽然a值赋给了x,但是a变量并不是x变量哦。我们对x任何的修改,都不会改变a变量。呵呵!虽然简单,并且一看就理所当然,不过可是一个很重要的认识喔。
3. 理解值传递的形式 看调用Exch1函数的代码: main() {
int a=4,b=6;
Exchg1(a,b) //这里调用了Exchg1函数 printf(“a=%d,b=%d”,a,b) }
Exchg1(a,b)时所完成的操作代码如下所示。 int x=a;//←
int y=b;//←注意这里,头两行是调用函数时的隐含操作 int tmp; tmp=x; x=y; y=tmp;
请注意在调用执行Exchg1函数的操作中我人为地加上了头两句: int x=a; int y=b;
这是调用函数时的两个隐含动作。它确实存在,现在我只不过把它显式地写了出来而已。问题一下就清晰起来啦。(看到这里,现在你认为函数里面交换操作的是a,b变量或者只是x,y变量呢?) 原来 ,其实函数在调用时是隐含地把实参a,b 的值分别赋值给了x,y,之后在你写的Exchg1函数体内再也没有对a,b进行任何的操作了。交换的只是x,y变量。并不是a,b。当然a,b的值没有 改变啦!函数只是把a,b的值通过赋值传递给了x,y,函数里头操作的只是x,y的值并不是a,b的值。这就是所谓的参数的值传递了。
哈哈,终于明白了,正是因为它隐含了那两个的赋值操作,才让我们产生了前述的迷惑(以为a,b已经代替了x,y,对x,y的操作就是对a,b的操作了,这是一个错误的观点啊!)。
C中的指针强制转换问题
2007-11-26 10:20:11
http://topic.csdn.net/t/20061110/16/5148811.html 从CSDN上找到的资料,解决了我很久以来的一个疑问 问题源:
C++的这种风格的代码是什么意思?是指针的强制类型转换吗? 有什么好处?会不会有什么风险?
Subscrīption *subscrīption = (Subscrīption *) event->data_;
3 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-11-10 16:16:15 得分 30
是指针的强制类型转换。
危险是:你必须明确知道data_里放的数据确实是Subscrīption类型的。 好处?没好处,是迫不得已。当你从消息队列或者socket收数据时,收到的都是无类型的一堆2进制字节流,你只能进行强制类型转换,然后才能操作它 7 楼goodluckyxl(被人遗忘的狗)回复于 2006-11-10 16:23:56 得分 30 C++的这种风格的代码是什么意思?是指针的强制类型转换吗? 有什么好处?会不会有什么风险?
没什么意思,这个只是沿用c语言得强转路线 是指针得强转
好处就是在内存分布一致得情况下,直接强转可以得到正确得成员数据 会有风险,如果说这个结构存在复杂内存分布,不一定以成员作为第一偏移得话
就转出错误数据
22 楼flyingbug(Effective Refactoring)回复于 2006-11-10 17:35:04 得分 0
刚才看了c的内存布局和内存对齐问题,据那上面的说法,c标准并没有规定struct在内存中是否是连续分布的,但是规定了声明顺序等同于内存中的顺序,不同的平台上对齐的标准也不一样
那么,我们用socket传送对象或结构的时候,将一个对象转换成字符流,究竟改遵循什么原则呢?把各个成员按照声明顺序转成char数组然后拼在一起?
c语言指针数组
2008-04-17 16:25:32 / 个人分类:c语言
我们可以让指针指向某类变量,并替代该变量在程序中使用;我们也可以让指针指向一维、二维数组或字符数组,来替代这些数组在程序中使用,给我们在编程时带来许多方便。
下面我们定义一种特殊的数组,这类数组存放的全部是指针,分别用于指向某类的变量,以替代这些变量在程序中的使用,增加灵活性。指针数组定义形式: 类型标识*数组名[数组长度] 例如: char *str[4];
由 于[ ] 比*优先权高,所以首先是数组形式str[4 ],然后才是与“*”的结合。这样一来指针数组包含4个指针s t r [ 0 ]、s t r [ 1 ]、s t r [ 2 ]、s t r [ 3 ],各自指向字符类型的变量。例如: int *p t r [ 5 ] ;
该指针数组包含5个指针p t r [ 0 ]、p t r [ 1 ]、p t r [ 2 ]、p t r [ 3 ]、p t r [ 4 ],各自指向整型类型的变量。
[例6-22] 针对指针数组的应用,我们分别用指针数组的各指针指向字符串数组、指向一维整型数组、指向二维整型数组。 #include
char *ptr1[4]={\/* 指针数组p t r 1 的4个指针分别依此指向4个字符串* / int i,*ptr2[3],a[3]={1,2,3},b[3][2]={1,2,3,4,5,6}; for(i=0;i<4;i++)
printf(\依*此输出ptr1数组4个指针指向的4个字符串*/ printf(\for(i=0;i<3;i++)
ptr2[i]=&a[i];/*将整型一维数组a的3个元素的地址传递给指针数组ptr2*/ for(i=0;i<3;i++)/*依此输出ptr2所指向的3个整型变量的值*/ printf(\printf(\for(i=0;i<3;i++)
ptr2[i]=b[i];/*传递二维数组b的每行首地址给指针数组的4个指针*/ for(i=0;i<3;i++)/*按行输出*/
printf(\}
程序中指针数组与所指对象的关系如图6-12所示。
ptr1 指针数组中的4个指针分别指向4个字符串,如图6-11的a)所示,程序中依此输出;ptr2指针数组共有3个指针,若将整型一维数组a中各元素地址分别 传递给指针数组的各指针,则ptr2[0]就指向a[0];ptr2[1]就指向a[1];ptr2[2]就指向a[2]。若将二维数组各行的首地址分别 传递给指针数组的各指针,如图6-11b)所示,这样一来,ptr2[0]就指向了b数组的第0行,该行有两个元素,其地址为ptr2[0]与ptr2 [0]+1;相应指针数组第i个元素ptr2[i]指向的b数组的第i行两个元素地址分别为ptr2[i]与ptr[i]+1。
在处理二维字符数组时,我们可以把二维字符数组看成是由多个一维字符数组构成,也就是说看成是多个字符串构成的二维字符数组,或称为字符串数组。 指针数组对于解决这类问题(当然也可以解决其它问题)提供了更加灵活方便的操作。
有一点需要说明,若定义一个指针数组后,指针数组各元素的取值(即地址)要注意安全性。
如定义指针数组: char*ptr[3];
我们说该数组包含三个指针,但指针的指向是不确定的,指针现在可能指向内存的任一地址。假定现在作语句:scanf(\则输入的字符串在内存的存放其地址由ptr[i]决定。除非给指针数组元素赋值安全的地址。
[例6-23]定义字符指针数组,包含5个数组元素。同时再定义一个二维字符数组其数组大小为5*10,即5行10列,可存放5个字符串。若将各字符串的首地址传递给指针数组各元素,那么指针数组就成为名副其实的字符串数组。下面对各字符串进行按字典排序。
在 字符串的处理函数中,strcmp(str1,str2)函数就可以对两个字符串进行比较,函数的返回值>0、=0、<0分别表示串str1 大于str2、str1等于str2、str1小于str2。再利用strcpy()函数实现两个串的复制。下面选用冒泡排序法。 #include
char*ptr1[4],str[4][20],temp[20];
/*定义指针数组、二维字符数组、用于交换的一维字符数组*/ int i,j;
for(i=0;i<4;i++)

