linux c 学习日记...
时间:2010-08-13 来源:zdcsky123
水平有限,部分内容仅供参考!
调用数学函数,比如sqrt(),编译时加-lm,让gcc连接到包含math.h的数学库。
16:03 2010/8/1
for()循环的阶梯形式可以确定一个边界。
一个int型数组a[n],strlen(a) == sizeof(a)/sizeof(int);
22:31 2010/8/1
二维数组遍历的方式:
int arry[M][N]----->两次循环直接取值。
int *p=arry[0] ------>for(i = 0; i < M * N; i++)---->二维数组内存也是连续的,同一维数组。
int (*p)[M] = arry ---->利用行指针。
*<------>[]
数组在函数间需要传递两个参数,内存地址和长度。
一维数组:int arry[N],实参(arry, N)。形参(int *arry,int N)或者(int arry[],int N)。
二维数组:int arry[][N],实参形式A(arry[0],sizeof(arry)/sizeof(int)),
实参形式B (sizeof(arry)/sizeof(int)/N,N,arry)>传递行指针,指针类型为N个int。
形参(int *arry,int N)或者(int arry[],int N),
(int len1; int len2; int (*arry)[len2--->列数])。
21:41 2010/8/2
结构体赋值:
A.初始化的时候赋值 struct student S1 = {"zdc", 20, 99};
B.错过了初始化 strcpy (S1.name, "zdc"); S1.age = 20;
错误的方式:S.name=“zdc”---->char a[10]; a = "zdc";/int a[10]; a={1,2,3};
21:45 2010/8/2
函数指针的应用---->根据结构体中的信息按多种方式排序
int stu_age_compare(student *s1, student *s2)
{
return s1->age - s2->age;
}
void stu_sort(student *arry, int stu_num, int (*pfun)(student *, student *))
{
int i, j;
student temp;
for(i = 0; i < stu_num - 1; i++)
for( j = 0; j < stu_num - i - 1; j++ )
if((*pfun)(&arry[j], &arry[j + 1]))
{
temp=arry[j + 1];
arry[j + 1] = arry[j];
arry[j] = temp;
}
printf("\n\nAge_sort:\n");
stu_arry_putout(arry, stu_num);
}
21:55 2010/8/2
静态配置IP
1.进入cd /etc/udev/rules.d/,删除 70-persistent-net.rules内所有内容
2.改两个配置文件
sudo vi /etc/network/interfaces
添加:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.99 #设置IP
netmask 255.255.255.0 #子网掩码
gateway 192.168.1.1 #网关
配置DNS:
sudo gedit /etc/resolv.conf
添加:
nameserver 192.168.1.1 (把原理内容注释)
网络重启:
sudo /etc/init.d/networking restart
21:58 2010/8/2
int main(int argc, char *argv[])
argc---->参数个数,至少唯一,可执行文件名。
argv---->指针数组。
19:38 2010/8/3
const int *p;---->不能通过p修改所指向的变量的值。
int *const p;---->不能改变p的指向。
19:40 2010/8/3
extern的作用:
A.扩展全局变量的作用域,在main中声明非文件前端的全局变量。
B.提示编译器寻找文件以外变量的定义。
19:42 2010/8/3
GDB查看变量的方式:
A.watch
B.info local
C.display
D.b if a=3
19:44 2010/8/3
想要通过函数改变一个原函数中变量的值,必须传地址,指针变量也如此,即要改变一个指针的指向,必须传递二级指针。
eg:malloc写进子函数后,调用的方式有两种:A.二级指针 B.return
19:47 2010/8/3
char *name<----->char name[]
区分:
A.char *name = "zdc" --->name为字符串常量,不可修改,但内存也不会释放,可以在子函数中return
B.char name[]="zdc"---->name为数组变量,可以修改其中元素,但子函数结束时内存自动释放
char *name;-->不初始化,要在后面用malloc动态开辟内存
char name[N]-->不初始化,也已分配好内存,且长度固定,但可用realloc修改
19:52 2010/8/3
free(p);---->p变为野指针--->很危险,所以,p = NULL;
19:53 2010/8/3
sizeof(int)== 4;
sizeof(float)== 4;
sizeof(char)== 1;
sizeof(short)== 2;
sizeof(long)== 4;
sizeof(double)== 8;
结构体内存补齐:
linux下gcc默认4字节。
20:39 2010/8/4
#include <XXX.h>
#ifndefine _LIST_H_
#define _LIST_H_
...
...(结构体定义)...
...(函数声明)...
...
#endif
--------------------->防止重复定义
20:41 2010/8/4
head = &p;
p为头结点,数据域为空。
20:42 2010/8/4
if(P->next) / if(P)
P指向不为NULL,则为真,即P指向节点为真。
P所致的元素的指针域不为NULL,则为真,即P所指节点后有节点为真。
eg:
if(P){ printf(P);} ----->链表全部元素遍历
if(P-next){ printf(P);}----->最后一个节点没有输出
while(P->next && P->next->date != X)--->P指向倒数第二个节点时,已经判断了最后一个节点,所以没有必要对最后一个节点进行操作。
------>P->next为假,所以跳出循环,不执行块函数,即没有对P所指向的最后结点进行操作。
20:51 2010/8/4
线性结构: 线性表、栈、队列
数据的逻辑结构<
非线性结构: 树形结构、图形结构
顺序存储
数据结构 { 数据的存储结构<
链式存储
数据的运算:增、删、改、查、排序...
22:33 2010/8/4
释放数组中的一个成员,程序崩溃。
22:38 2010/8/10