c语言的一些高级用法

最近在看《c和指针》,每天会更新一些,如有错误望指正。

数组名是一个指针常量,不能修改。所以像int a[10];a++;是不合法的,但是访问*(a+1)是可以的。指针却可以。int *b=a;是复制了整个数组,而不是仅仅有a[0].故先用指针复制数组,再用指针的地址给其他地址赋值,也会复制整个数组。

虽然再函数中修改数组的局部变量,会改变数组的值。但让a[0]=b[0]之后再修改,b[0]是不会修改a[0]的。这也很好理解,a[0]就相当于*p,a就相当于p,那么a[0]=x,就相当于*p=x,所以a[0]在函数中也能被修改。但是a[0]=b[0],就相当于*p=*q,之后*q=x,*p并不会被修改,因为p和q的地址并不相同。

对于int a[10],*ap; ap=a; ap++;其中ap++是ap=ap+1*sizeof(int),里面是有一个乘法的。


若函数的形参中swap(char *string),传入的是a;然后在函数中使用string++并不会影响a,a不会++,实际上就算不在函数中,a也不会++,因为string是对a的一个备份。

char str[]="asd";char *str="asd";两者的区别很大,前者的地址是不能修改的常量,但是它所指向的值是可以修改的;后者是将地址str设为字符串常量“asd”的存储区,所以str的实际类型是const char*,所以*str不能修改,但是str是可以修改的,而像str++,就是舍去了第一个字符。

若int a[3][10];int *b=&a[1][8];那么*++b就是a[1][9],再*++b就是a[2][0],按照二维数组的存储顺序访问的。

多维数组创建时必须指明下标。

printf("%s",a);a实际上是一个地址才行。

int a[3][10];printf("%s\n",*a);输出的是整个a,且不会换行。printf("%s\n",*(a+1));输出的从第二行开始的所有值。这也很好理解,二维数组a[][]相当于**p,*a就相当于*p,对地址只进行一次解码,解出来的是第一行的首地址,*(a+1)就是第二行的首地址(可以理解为*a+*1),*(a+1)+1就是在第二行首地址的基础上,再往后移动一个元素,这是二维数组的第一行的元素就是普通的int变量,如果是三维数组,往后移一个就是一个一维数组。

不可以让int *p=a;a为二维数组。

int mat[ ][10];int (*mat)[10]是一样的,只有第一维的下标是不需要指明的

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值