一、二级指针什么时候用
1、把无序的物理地址变为连续的线性逻辑;(物理上无序,逻辑上有序)[链表]
数组,是连续的线性逻辑,通过下标的递增,保证了逻辑上的连续性
数组里不保存普通值,而保存地址,假设这个地址指向的内存是char类型
char *buf[5]; char **p = buf;
例如main函数的参数,通过argv来获取用户输入的参数
argv[0,1,...2,...3];
2、子函数更新主函数中变量值的方式
传统上,主函数定义了一个int空间,子函数就必须接收一个int * 的变量,通过这个变量,反向更新,将主函数中的int空间的值进行修改;
子函数中 *p = xxx;
那么,如果子函数中想更新一个int * 的值,必须传递一个int * * 的变量来达到同样的效果;
子函数更新主函数一维地址空间的时候;
直接初始化0,所以已经初始化,由结束标志,输出hello;
形参的数组名不是数组的真实空间,是指针变量大小,所以循环次数可能是8或4;
sizeof(str)/sizeof(str[0]);计算数组长度;
str字符个数要加1;要算字符个数要用strlen();
strlen("")=0;strlen空串是0,该函数不会计算\0;
数组名是没有盒子来存这个地址的,&a值和a一致,行为
&a + 1,是一个数组一个数组加,指针的地址会到a数组后面,
答案2 5;//*(a +1)从数组的首地址加一个int的地址,指向2;
两种写法一样,
*strArr[],//装的字符串地址,把字符串地址线性逻辑化;
char *(*pstr)[6];pstr6个地址6个地址走,一个字节一个字节访问;
(*p)[4]//存的是地址,4个int4个int地访问地址;
int a[3][4] = {1,2,3.....}//二维数组看后面那个来操作空间,a是4个int4个int地访问地址;
假如 i = 1,j = 2;
a[1][1] =5; a[0][0]=1;
*(*(p+i)+j) = p[1][2] = 7;
1、二进制位中1的个数
方法一:data不变,把1左移进行与位运算;
方法二:把data右移,与1与位运算;最终data可能把低位的1都推走,剩下的数就是0,没必要数;
方法三:减一借位相与位运算;
任意空间1的个数;