不要把赋值运算写进逻辑运算里,逻辑运算都是从左到右进行的。
对于&&来说左边如果不成立,右边就不会进行计算了
对于||来说则刚好相反
逗号优先级最低,且用途很单一。编程中很少出现拿逗号来进行计算的
指针
好习惯:在定义一个指针时初始化为0
不同类型的指针不能相互赋值
void*与void详解https://blog.csdn.net/xautfengzi/article/details/2290741
&取变量的地址,并不能取表达式(表达式是没有地址的
*取内容运算符,取得所在地址的值
因为各个函数之间只能做值的传递,而指针起到了用某一变量穿插在各个函数的作用
***************************************************************数组与指针**************************************************************************
数组是特殊的指针变量
数组变量本身表达地址所以在取数组变量时无需用&
但是数组单元是变量同样需要&取地址
数组时:int a[10]; int *p=a;(其实指向的是数组的第一个元素的地址)
数组变量时:int *p==&a[2];(需要用&取地址)
整形变量时 : int a ; int *p=&a;(需要用&取地址)
数组是const的指针,无法被赋值
————————————————————————指针运算————————————————————————————
把指针+1是让指针指向下一个变量,而如果指向的不是一片连续存储的空间(ex:数组)那么这样的指针运算就没有意义
————————————————————指针常量和常量指针 (易混)———————————————————————
指针常量→指针型的常量
*在const前面 ex: int *const p=&i
指针p是一个const,p永远指向i并因此可以通过p来修改i 的值
# include <stdio.h>
int main ()
{
int i=64;
int *const p=&i;//指针p永远指向i
printf("%d\n",i)
*p=45;
printf("%d\n",*p);
printf("%d\n",i);
return 0;
}
常量指针→常量型的指针
*在const的后面 ex: const int *p=&i OR int const *p
指针p可以指向i也可以指向j,但因此也失去了修改变量的能力
# include <stdio.h>
int main ()
{
int i=64;
int j=89
int const* p=&i;
*p=45;//错误
*p=j//不可以的
p=j//可以的
printf("%d\n",*p);
printf("%d\n",i);
return 0;
}
p和*p和&p的区别https://blog.csdn.net/zandaoguang/article/details/77161577(较为简单)
https://zhidao.baidu.com/question/872413254876148412.html(教复杂,其中提到悬浮指针的概念)
————————————————————*在表达式和声明数据类型中的区别—————————————————————
*在声明数据类型中仅仅表示类型为指针
*在表达式中则是取地址内容运算符,ex:
p—》指针p指向的地址
&p—》指针p存储在内存中的地址
*p—》指针p指向的地址中的内容
————————————————————————malloc(分配内存)函数———————————————————————
函数原型 malloc(long NumBytes)
free和malloc函数类型都是指针
free是与malloc配套的一个函数,在malloc借用了电脑的内存后需要用free释放这些内存(值得注意的是free)
malloc函数在堆中申请一部分空间(实际上malloc占用的空间比申请的略大,多出来的部分是记录malloc函数的管理信息),如果开辟成功,返回空间首个字节地址,失败则返回NULL
free(free的地址在栈上,释放的内存则在堆上)只能返还(其实是释放)malloc借来的地址,
free函数一般形式 free(借用内存的表达式)
malloc与free函数原理https://blog.csdn.net/llhyy17/article/details/5375298
进程是什么?线程又是什么https://blog.csdn.net/C2496649361/article/details/80655068(关于栈和堆的粗略印象)