指针
一,传值、引用方式
//()优先级最高
Swap1 引用
- void swap(int *a, int *b){
- int temp;
- temp = *a;
- *a = *b;
- *b = temp;
- }
交换成功
Swap 2 传值
- void swap(int a, int b){
- int temp;
- temp = a;
- a = b;
- b = temp;
- }
交换失败
二,数组与指针的不同 : sizeof(name of array) & sizeof(ptr)
size_t 的类型是unsigned long
- printf("\nsizeof(ptr) is %u\n", sizeof(ptr));
- printf("sizeof(*ptr) is %u\n", sizeof(*ptr));
- printf("sizeof(array) is %-ud\nsizeof(array[0]) is %-ud\n",sizeof(array),sizeof(array[0]));
- printf("The number of the array is %d", sizeof(array) / sizeof(array[0])); //可以用来计算数组中元素的个数
三,指针运算
- 指针的加减和比较:只有指向统一数组的指针进行指针算数和比较才有用 否则useless
- 只有相同类型的指针才可以赋值。不过void *ptr 除外 ,void *ptr 表示各个指针类型的通用指针
四,用数组或指针实现字符串的复制
- void copy1(char *a,const char *b) //将b字符串复制到a中 (数组)
- {
- for (size_t i = 0; (a[i] = b[i]) != ‘\0‘;i++)
- {
- ;
- }
- }
- void copy2(char *a, const char *b)//将b字符串复制到a中 (指针)
- {
- for (; (*a = *b) != ‘\0‘;a++,b++)
- {
- ;
- }
- }
结果:
Copy1中的a[i] = b[i] 完成了赋值,然后(a[i] = b[i]) != ‘\0‘是判断是否是字符串的末尾,i++代表数组的下标在每循环一次的时候会加一
同理 copy2中的*a = *b完成了赋值,然后(*a = *b) != ‘\0‘是判断是否是字符串的末尾 因为*a *b最初都代表的是字符串的第一个字符,所以a++,b++代表指针的移动(针对数组这样的移动才有效)
一个小坑
在copy1 和copy2中都是空循环,赋值语句在判断语句已经中完成了,并且都是 (*a = *b) != ‘\0‘
那我们把这copy2改一下,把判断条件和赋值语句分开写。
我们知道字符串末尾一定是有‘\0‘的
- void copy3(char *a, const char *b)
- {
- for (; *a != ‘\0‘; a++, b++) //a最后有\0
- {
- *a = *b;
- }
- }
- void copy4(char *a, const char *b)
- {
- for (; *b != ‘\0‘; a++, b++) //a最后没有\0
- {
- *a = *b;
- }
- }
结果:
所以复制字符串一定要把\0复制进去,如果没有\0 会出现以上乱码。