从自学c语言开始也好几天了,感觉忘性还是有点大,我想写写小结吧,把东西回忆回忆。
就回忆下今天遇到的一些东西。
1.三目运算符
条件? A : B
?是三目运算符的关键字
2.下面先后定义了两个数组
- 内存分配地址时按照定义先后顺序从大到小分配,在数组内部却是从小到大分配。
- 数组的地址=》数组首元素的地址
- 数组名 =》数组地址
`int num [2] ={1,2};
int num2[2] ={3,4};
`
3.数据类型
- 基本数据类型
- 构造类型
- 字符串型
指针
4.占位符
int =>%d %i
- float double=> %f
- char =>%c
- 字符串=>%s
- long =>%l
- long long => %lld
- unsigned long =>%zd
5.一则错误
conflicting types for ‘x’ =>冲突的类型
今天如何解决:检查函数调用时是否声明
6.sizeof的返回值是unsigned long型。
7.不论定义了什么样的指针,都是八个字节,那为何还要规定指向类型?
因为!
举个例子:
int *p;
char *p;
在赋值,或者提取的时候,编译器是这样操作的。从p所指向的地址开始,根据指向类型取出或者放入到(操作)多少个字节中去,int类型的就是操作到4个字节结束,char类型就是操作一个字节结束。
当你没有确定指针指向类型,或者错误的指向类型,就很可能操作到其他不该操作的内存。十分的危险!
8.数组元素的访问方式
- 数组名[下标] eg:ages[i]
- 指针变量名[下标] eg:p[i]
- *(p+i)
#include <stdio.h>
int main(int argc, const char * argv[]) {
int ages[4] ={10,9,8,7};
int *p;
p = &ages[0];//p=ages;
for(int i = 0;i < 4;i++)
{
printf("ages[%d]=%d\n",i,*(p+i));
}
return 0;
}
- 上面代码中p+i,指针加1,地址增加多少取决于指针指向类型,int型加4,char型加1.
- 实际上,p+i也就是从p当前所保存的元素地址开始,第i个的地址。
例如此处p+2=>ages[2]
9.定义字符串的两种方式
- 方式一:利用数组
- char name[] =”hzl is cool”
- 特点:字符串的内容可以修改
- 场合:需要经常修改字符串内容的时候
- 方式二:利用指针
- char *name2 =”hzl is cool”
- 特点:此时字符串其实是一个字符串常量,存放于常量区,字符串内容不能进行修改
场合:字符串的内容不需要修改,字符串经常使用
10:字符串的输入
scanf(“%s”,name):将用户输入的字符串从name地址开始一个个存放,最后在末尾加上\0.
eg:
`
int main(int argc, const char * argv[]) {
int ages[4] ={10,9,8,7};
int *p;
p = &ages[0];//p=ages;
for(int i = 0;i < 4;i++)
{
printf("ages[%d]=%d\n",i,*(p+i));
}
return 0;
}
`
ps:好奇怪。为啥加了头文件下面的代码都不见了。