Linux C 学习日记

水平有限,部分内容仅供参考!

调用数学函数,比如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

你可能感兴趣的:(数据结构,c,linux,null,2010,math.h)