【423】COMP9024 Revision

目录:

  1. array
  2. '\0' 与 EOF
  3. 二维字符数组(字符串数组)

 

1. array:

参考:C 数组

参考:C 字符串

参考:C笔记之NULL和字符串结束符'\0'和EOF

总结:【个人理解,可能不全面】数组对于数字型和字符型有不同,数字数组就是实际长度,而字符型数组需要增加一个 '\0',所以对于数字数组可以这样定义  int num[] = {1, 2, 3, 4, 5}; ,而字符型数组需要预先定义长度,否则没有 '\0' 会出错,需要这样定义 char str[6] = {'h', 'e', 'l', 'l', 'o'};或者 char str[] = "hello",会自动添加 '\0'。

#include <stdio.h>
#include <string.h>

int main(void)
{
	char *r = "hello";
    char s[10] = {'h','e','l','l','o'}; 
    char ss[] = {'h','e','l','l','o'}; 
    char t[] = "hello";    
    
    int num[] = {1, 2, 3, 4, 5};        

    printf ("r = %s\ns = %s\nss = %s\nt = %s\n", r, s, ss, t);
    printf ("The length of r is %ld.\n", sizeof(r));	// address
    printf ("The strlen of r is %ld.\n", strlen(r));	// actual length
    printf ("The length of s is %ld.\n", sizeof(s));	// s[10] with '\0'
    printf ("The length of ss is %ld.\n", sizeof(ss));	// print with error
    printf ("The length of t is %ld.\n", sizeof(t));	// t[6] with '\0'
    printf ("The strlen of t is %ld.\n", strlen(t));	// actual length
    printf ("The length of num is %ld.\n", sizeof(num)/sizeof(num[0]));	// actual length
    
    for (int i = 0; i < sizeof(num)/sizeof(num[0]); i++) {
    	printf("%d\n", num[i]);
    }
    
/*	r = hello*/
/*	s = hello*/
/*	ss = hellohello				----error----*/
/*	t = hello*/
/*	The length of r is 8.*/
/*	The strlen of r is 5.*/
/*	The length of s is 10.*/
/*	The length of ss is 5.		----without '\0'----*/
/*	The length of t is 6.*/
/*	The strlen of t is 5.*/
/*	The length of num is 5.*/
/*	1*/
/*	2*/
/*	3*/
/*	4*/
/*	5*/

    return 0;
}

 

2. '\0' 与 EOF 的区别

参考:C语言中EOF是什么意思?

前者作为字符串的结尾标志

后者作为文件的结尾标志

如下所示:(0,与 -1)

#include <stdio.h>
#include <stdlib.h>

int main(){
	printf("\'\\0\' is %d\n", '\0');
	printf("EOF is %d\n", EOF);
	
/*	'\0' is 0*/
/*	EOF is -1*/
	
	return 0;
}

 

3. 二维字符数组(字符串数组)

多维字符数组可以用双星号来表示

参考:C语言的字符串数组

参考:指向指针的指针

#include <stdio.h>
#include <stdlib.h>

int main(){
	// str is the pointer of array which is still pointer
	char *str[] = {"alex", "bn", "lee"};
	
	// str[0] means the first array (e.g. "alex")
	printf("The first string is %s.\n", str[0]);
	// str + 1 means the pointer of second array
	// add * in front of it, then it will become the pointer of chars
	// and it can be printed as string
	printf("The second string is %s.\n", *(str + 1));
	// Just like above one
	// *(str + 2) means the pointer of chars (e.g. "lee")
	// *(str + 2) + 1 means the pointer of the second character
	// *((str + 2) + 1) means element of that pointer
	printf("The second character of the third string is %c.\n", *(*(str + 2) + 1));
	
/*	outputs:*/
/*	The first string is alex.*/
/*	The second string is bn.*/
/*	The second character of the third string is e.*/
	
	return 0;
}

双星号:不能直接定义信息,需要指向

#include <stdio.h>
#include <stdlib.h>

int main(){
	// str is the pointer of array which is still pointer
	char *str_o[] = {"alex", "bn", "lee"};
	// you can't assignment **str directly since it can only be used for string (* to array)
	// but you can define a **str point to str_o
	char **str = str_o;
	
	// str[0] means the first array (e.g. "alex")
	printf("The first string is %s.\n", *str);
	// str + 1 means the pointer of second array
	// add * in front of it, then it will become the pointer of chars
	// and it can be printed as string
	printf("The second string is %s.\n", *(str + 1));
	// Just like above one
	// *(str + 2) means the pointer of chars (e.g. "lee")
	// *(str + 2) + 1 means the pointer of the second character
	// *((str + 2) + 1) means element of that pointer
	printf("The second character of the third string is %c.\n", *(*(str + 2) + 1));
	
/*	outputs:*/
/*	The first string is alex.*/
/*	The second string is bn.*/
/*	The second character of the third string is e.*/
	
	return 0;
}

 

4. typedef & struct

struct 基本格式如下:(注意最后的 semicolon)

 struct date {
     int day;
     int month;
     int year;
 };

 // struct date will become one thing
 struct date birthday;

typedef 可以将一个整体的东西用一个新的字符串表示

typedef struct {
    int a;
    int b;
} Pair;
...
Pair x;

or

typedef struct date Date

Date d;

struct 中的指针使用

// pointerstruct.c
#include <stdio.h>

typedef struct {
  int name;
  int salary;
} Worker;                    // Worker is now a type, like char and int

int main(void) {
  Worker w, *wp;             // define variables with the new type

  wp = &w;
  *wp.salary = 125000;       // generates a compiler error (see below)
  *(wp.salary) = 125000;     // so does this (same as previous line)

  w.salary = 125000;         // is probably what you want
  (*wp).salary = 125000;     // or you can use the pointer, but this looks kludgy
  wp->salary = 125000;       // this is the 'sexy' way to use pointers

  return 0;                  // being lazy, should be EXIT_SUCCESS
}

简化如下:

structTypeName  s, *sp;
sp = &s;

// then the following are equivalent: 

s.element
(*sp).element
sp->element

 

5. Makefile

An example of a rule in a Makefile is:

ex1: ex1.c ex1.h
     dcc -O3 -o ex1 ex1.c

It is important to note that dcc above is preceded by a tab (and not spaces).

Every file in UNIX has a timestamp, which is the time it was created or last modified.

  • If you type in the command make, then make will compare the timestamps of each of the files in the dependencies with the target.

  • If any of these dependency files is newer than the target, make will execute the command again (which usually makes the target again).

  • If none of the files is newer, make simply reports that the target is up to date.

You can have multiple targets. Below we show three targets:

all: ex1 ex2

ex1: ex1.c ex1.h
     dcc -O3 -o ex1 ex1.c

ex2: ex2.c ex2.h
     dcc -O3 -o ex2 ex2.c

You can then type make ex1 or make ex2 as you wish.

If you type simply make, then the default is to make the first target only, which in this case is all, which in turn has as its dependencies the other two targets. This command will make either or both the executables if they are older than their course code.

You can generalise the Makefile by defining and using variables, such as:

 

CC=dcc
CFLAGS=-O3

all: ex1 ex2

ex1: ex1.c ex1.h
     $(CC) $(CFLAGS) -o ex1 ex1.c

ex2: ex2.c ex2.h
     $(CC) $(CFLAGS) -o ex2 ex2.c

 

The variables will be substituted when the Makefile is executed.

You can also add a target to clean up your directory after you have finished:

CC=dcc
CFLAGS=-O3

all: ex1 ex2

ex1: ex1.c ex1.h
     $(CC) $(CFLAGS) -o ex1 ex1.c

ex2: ex2.c ex2.h
     $(CC) $(CFLAGS) -o ex2 ex2.c

clean:
     rm -f ex1 ex2 ex1.o ex2.o core
  • the clean target has no dependencies, and here removes the executable, the object files, and core dumps

  • the command make clean will execute the rm instruction

  • the -f switch means that rm will not complain if any files are do not existent

 

6. 链表(Linked List)

  typedef struct node {
      int data;
      struct node *next;
  } LinkedL;

or

  typedef struct node {
      int data;
      struct node *next;
  } *LNode, *LinkedL;

列表遍历,可以通过 for 语句或者 while 语句,判别条件都是最后是否为 NULL

// traverse the list (of 2 elements)
for (LinkedL *p = n1; p != NULL; p = p->next) {
  printf("%d\n", p->data);
}

// or

LinkedL *p = n1;
while (p != NULL) {
  printf("%d\n", p->data);
  p = p->next;	
}

 

 7. struct 内存空间

看里面最大的为基准来考虑,就是如果最大为 1 byte,则此为单元,如果 8 bytes 最大,则以此为单元,不满足的需要 padding。

#include <stdio.h>
#include <stdlib.h>
 
struct somedata1 {
    char age;      // 1 byte
    char weight; // 1 byte
    char gender;  // 1 byte
};               // aligns to 3 bytes
 
struct somedata2 {
    int age;      // 4 bytes
    char *weight; // 8 bytes
    char gender;  // 1 byte
};               // aligns to 24 bytes
 
struct somedata3 {
    int age;      // 4 bytes
    int weight; // 4 bytes
    char gender;  // 1 byte: either 'f' or 'm'
};               // aligns to 12 bytes
 
int main() {
     
    printf("somedata1: %ld\n", sizeof(struct somedata1));
    printf("somedata2: %ld\n", sizeof(struct somedata2));
    printf("somedata3: %ld\n", sizeof(struct somedata3));
 
/*  outputs:*/
/*  somedata1: 3*/
/*  somedata2: 24*/
/*  somedata3: 12*/
     
    return 0;
}

 

 

 

 

 

转载于:https://www.cnblogs.com/alex-bn-lee/p/11120352.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值