数据类型:向计算机申请存储数据的内存大小,如int 申请4字节的大小。变量是用来存储值的所在处,它们有名字和数据类型.变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中
试卷的笔记:
电脑是X86 裸机是ARM
编译程序:gcc 和 arm-linux-gcc
字符串表示:反斜杠要必须双数。查字符表。
二维数组不能用数组名表示数组首地址。也不能用取址符&
char 数组直接存放数字时候,如char a[]={1,2,3,4,6,} ,则正确,而且a[0] 是在ascii 表上的 1 数字对应的字符。
double 是打印精度为六位。小数点后六位。
在循环中,字符串读取到“\0”时候是判断为假。
c语言不能定义void型普通变量。
清晰理解值传递和地址传递。
值传递不能改变原来变量的值。传递指针类型的变量不等于地址传递。
打印行号、函数名、源文件名:__LINE__ , __FUNCTION__ , __FILE__;
int 整型数据 (4字节) 3 3 6 10 60 1000
char 字符型 (1字节) ‘a’ ‘c’ ‘1’ man ascii
Oct Dec Hex Char
100 64 40 @
short (short int) (2字节)
long (long int ) (4字节)
long long int (8字节)
float 浮点型 (4字节) 1.3 1.0e2;
double 双精度浮点型 (8字节)
无符号数据 unsigned
unsigned int
科学计数法:5e2=5*10^2
%d %x %o %u—> int 打印有符号十进制,无符号十六进制,无符号八进制数。无符号十进制
%c —> char
%hd —> short
%hhd –>打印一个字节大小
%ld —> long int
%lld –>long long int
%10.2e –>输出科学计数法。保留两位小数,输出10位。
%hhd –>一个字节数据
%f ,%e —>float 小数点输出六个零。
%lf —>double 小数点输出六个零。
%m.nd /%m.nf –>m 输出值占用m位输出,n表示保留多少小数
%-m.nf —>向左对
%s 字符串
%p 打印指针,打印地址
10.C语言引用头文件使用的符号有两种,以头文件stdio.h为例:
(1)#include
头文件内容:
#ifndef __HEAD_H
#define __HEAD_H
// 1,普通函数的声明
void func(int size);
void f(void) // 普通函数定义不能放在头文件中,否则会导致重复定义
{
..
}
// 2,宏定义
#define PI 3.14
#define MAX(a, b) …
// 3,结构体、共用体类型定义
struct student
{
…
};
// 4,枚举常量列表
enum {…};
// 5,全局变量的声明
extern ing global;
// 6,静态函数的定义
static int min(int a, int b)
{
return a
static的三个作用:
1,修饰全局变量:使之由原来的外部链接(对外可见),变成内部链接(只对本文件可见)
2,修饰普通函数:使之由原来的外部链接(对外可见),变成内部链接(只对本文件可见)
3,修饰局部变量:使之由原来的自动存储(存储在栈),变成静态存储(存储在数据段)
头文件的格式
以头文件xxx.h为例:
#ifndef __XXX_H (防止本头文件被重复包含)
#define __XXX_H
…
…(头文件正文)
…
#endif
指针
指针在传递时候,形参和实参也是复制一份指针类型。然后操作指针指向的对象,而不操作原指针本身内容。
示例代码
int * fun(int *p)
{
int b=2;
p=&b;
return p;
}
int main(void)
{
int a=3;
int *p;
p=&a;
printf(“%d”,*p);
p=fun(p);
printf(“%d”,*p);
}
1, 指针的定义的正确理解:用于存放地址,而地址的长度取决于CPU字长。
int (*p);
第一部分: *p 让系统去为我开辟一块空间,叫做p,专门用来放地址
第二部分: int 为这块内存所放的地址,限定为int数据的地址
2,如何定义一个指针:
int (*k);
int (*k)[3];
void (*k)(int a, int b);
指针除了函数之外,对于变量和数组都要加取地址符号&;
指针的加法是向高地址移动对应的对象。
数组不能在赋值的左值。可以使用strcpy(str1,str2);str
2赋值给str1.
指针和数组的不同:
指针:保存数据地址;间接访问数据;动态的数据结构;指向匿名数据(在堆内存的数据)。
数组:保存数据;直接访问数据;存储固定数目元素;自身即为数据名。
在C编程中,当一个字符指针指向一个字符串常量
时,不能修改指针指向的对象的值。
char *p = “Hello World”;
*p = ‘h’; // 错误, 不能修改常量
实验六第二题。**
int a[4] = {1, 15, 5, 41};
int p1=(int )(&a+1);
int p2=(int )((int)a+1);
printf(“%d, %x\n”,p1[-1], *p2);
printf("a=%p\n",a );
printf("&a=%p\n",&a );
printf("&a+1=%p\n",&a +1);
//printf("%p\n",&(a+1) ); 错误
printf("a+1=%p\n",a+1 );
printf("&a[1]=%p\n",&a[1] );
printf("(非指针)(int)a+1=%#x\n",(int )a+1 );
结果:
41, f000000
a=0xbfe0a328
&a=0xbfe0a328
&a+1=0xbfe0a338
a+1=0xbfe0a32c
&a[1]=0xbfe0a32c
(非指针)(int)a+1=0xbfe0a329
从键盘获取数据方法:
1.sacaf(“%d”,&n);
2.char ch;ch=getchar(); //如果是输入的是字符串,那么最后要加上”\n”
3.char ch[50];fgets(ch,50,stdin);
//清空输入缓冲区:while(getchar() != ‘\n’);
//清零数组:bzero(str,0);memset(str,0,sizeof(str));
const 只读;const int*p; int const *p;
typedef : 为某一种数据类型,取一个别名
main()函数分析:int main(int argc, char *argv[ ]) 或者int main(int argc, char **argv)
//int main(int argc, char *argv[ ]) // ./exmaple 123 abcd
int main(int argc, char **argv) // ./exmaple 123 abcd
{
int i;
for(i=0; i
关于程序调试
1,语法错误,由gcc来检查
2,逻辑错误,由你来负责
2.1 使用printf来确定出错的位置,逐个排查错误
2.2 如果以上无法确定错误来源,而且错误是段错误Segmentatin fault(就是你的程序访问了非法的内存,比如使用了野指针)
可以让 gdb 帮我们直接定位出现段错误的地方。
A) 使用 -g 编译待调试代码
B) 去掉系统对core文件的大小限制: ulimit -c unlimited
C) 重新让程序死一遍,产生一个core文件
D) 使用 gdb 来直接定位: gdb ./example core (注意:不是100%能解决问题,看运气)
2.3 如果发生的不是段错误,或者用以上办法,gdb无法直接定位段错误的位置,那就只能单步调试
gdb 可供使用的常用命令:
list/l/l 10/l 2,30 (列出当前正在调试的代码)
breakpoint/b 20 (在第20行设置了一个断点)
b 20 if i>=100 (在第20行设置了一个条件断点)
b somefunction (在函数somefunction设置了一个断点)
run/r/r 123 abc (启动程序开始运行,可以带参)
print i/p i (查看变量i当前的值)
display i (持续跟踪变量 i 变化)
backtrace full/bt full (查看当前栈内存的详细细节)
whatis i (查看变量i的类型)
next/n (单步执行:函数调用将会被当做一步)
step/s (单步执行:将会进入函数调用内部)
continue/c (继续执行代码,直到遇到下一个断点,或者程序退出)
quit/q (退出调试器gdb)