1. 获取数组的地址无须 &, 因为数组名本身就是个地址
2. 数组元素的地址是连续的:
3. 数组名所代表的地址就是第一个元素的地址:
4. 通过指针访问数组元素:
5. 通过指针遍历数组:
6. 注意: 指针+1 是根据元素大小移动一个位置
1. 通过 &变量 可以获取变量地址:
2. 表示变量地址的变量就是指针:
3. *指针 就如同变量本身是一样的:
4. 声明指针时要注意初始化, 没有初始化的指针是危险的:
5. 指向常量的指针: 不能通过指针修改它指向的值, 但该值可以通过其变量修改
6. 常量指针: 锁定指针的指向
7. 指针是有类型的:
1. 数组的标志是 []:
2. 数组的大小和维数:
3. 遍历数组:
4. 对一维数组, 可以不指定维数, 它能自动识别:
4. 不指定维数的数组常常会用于字符串:
5. 二维数组:
5. 可以并只能省略第一个维数:
6. 多维数组:
7. 多维数组也是可以并只能省略第一个维数:
8. 没有初始化的局部数组变量, 包含的是一堆垃圾值:
9. 初始化数组为空其实很简单:
1. printf 枚举可显示枚举的序号:
2. 定义枚举时可同时定义变量:
3. 同时定义变量时, 你甚至可以不要枚举名:
4. 可随意指定序号:
5. 序号重了都不要紧:
#include <stdio.h> int main() { char c = 'A'; char cs[] = "ABC"; printf("%c, %s/n", c, cs); /* 获取字符及字符数组的内容 */ printf("%p, %p, %p/n", &c, cs, &cs); /* 获取字符及字符数组的地址, cs 与 &cs 没有区别*/ getchar(); return 0; }
2. 数组元素的地址是连续的:
#include <stdio.h> int main() { char cs[] = "ABC"; printf("%p/n%p/n%p/n%p/n", cs, &cs[0], &cs[1], &cs[2]); getchar(); return 0; }
3. 数组名所代表的地址就是第一个元素的地址:
#include <stdio.h> int main() { char str[] = "ABC"; char *p1 = str; char *p2 = &str[0]; printf("%p, %p/n", p1, p2); getchar(); return 0; }
4. 通过指针访问数组元素:
#include <stdio.h> int main() { char str[] = "ABC"; char *p = str; printf("%c/n", *p); printf("%c/n", *p+1); printf("%c/n", *p+2); printf("/n"); printf("%c/n", *p); printf("%c/n", *++p); printf("%c/n", *++p); getchar(); return 0; }
5. 通过指针遍历数组:
#include <stdio.h> int main() { char str[] = "123456789"; char *p = str; int i; for (i = 0; i < sizeof str/sizeof str[0]; i++) { printf("%c/n", *p); p++; } getchar(); return 0; }
#include <stdio.h> int main() { char str[] = "123456789"; char *p = str; while (*p != '/0') { printf("%c/n", *p); p++; } getchar(); return 0; }
#include <stdio.h> #include <string.h> int main() { char str[] = "123456789"; char *p = str; int i; for (i = 0; i < strlen(str); i++) { printf("%c/n", *(p+i)); } getchar(); return 0; }
#include <stdio.h> int main() { int nums[] = {111,222,333,444}; int *p = nums; int i; for (i = 0; i < sizeof nums / sizeof nums[0]; i++) { printf("%d/n", *p++); } getchar(); return 0; }
6. 注意: 指针+1 是根据元素大小移动一个位置
#include <stdio.h> int main() { int nums[] = {111,222,333,444}; int *p = nums; int i; printf("%d/n", *p); printf("%d/n", *(p+1)); printf("%d/n", *p+1); /* 不是这样; 这是代表取值后再 + 1 */ getchar(); return 0; }
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} {分割字符串的函数, 其实是个过程} procedure Split(const str: string; const c: Char; var List: TStrings); begin List.Clear; List.Delimiter := c; List.DelimitedText := str; end; {调用测试} procedure TForm1.Button1Click(Sender: TObject); var List: TStrings; s: string; c: Char; begin s := 'aaa;bbb;ccc;ddd'; c := ';'; List := TStringList.Create; Split(s,c,List); ShowMessage(List[1]); {bbb} List.Free; end; end.
1. 通过 &变量 可以获取变量地址:
#include <stdio.h> int main() { int num = 10; printf("变量值: %d/n", num); printf("变量址: %d/n", &num); getchar(); return 0; }
2. 表示变量地址的变量就是指针:
#include <stdio.h> int main() { int num = 10; int *p = # printf("%d, %p/n", num, p); getchar(); return 0; }
3. *指针 就如同变量本身是一样的:
#include <stdio.h> int main() { int num = 10; int *p = # printf("%d, %p, %d/n", num, p, *p); *p = 11; printf("%d, %p, %d/n", num, p, *p); (*p)++; printf("%d, %p, %d/n", num, p, *p); num = 99; printf("%d, %p, %d/n", num, p, *p); getchar(); return 0; }
4. 声明指针时要注意初始化, 没有初始化的指针是危险的:
#include <stdio.h> int main() { int n1 = 11; int n2 = 22; int *p = NULL; /* 初始化为空 */ p = &n1; printf("%d, %p, %d/n", n1, p, *p); p = &n2; printf("%d, %p, %d/n", n2, p, *p); getchar(); return 0; }
5. 指向常量的指针: 不能通过指针修改它指向的值, 但该值可以通过其变量修改
#include <stdio.h> int main() { int n1 = 111; int n2 = 222; const int *p = &n1; /* 注意 const 的使用 */ printf("%d, %p, %d/n", n1, p, *p); n1 = 333; //*p = 333; /* 不可以这样, 因为现在的指针是常量 */ printf("%d, %p, %d/n", n1, p, *p); p = &n2; /* 可以改变指针的指向 */ printf("%d, %p, %d/n", n2, p, *p); getchar(); return 0; }
6. 常量指针: 锁定指针的指向
#include <stdio.h> int main() { int n1 = 111; int n2 = 222; int *const p = &n1; /* 注意 const 的使用 */ printf("%d, %p, %d/n", n1, p, *p); n1 = 333; //*p = 333; /* 不可以这样, 因为现在的指针是常量 */ printf("%d, %p, %d/n", n1, p, *p); // p = &n2; /* 现在不可以改变指针的指向了 */ // printf("%d, %p, %d/n", n2, p, *p); getchar(); return 0; }
7. 指针是有类型的:
#include <stdio.h> int main() { long n = 100L; float f = 1.5f; double d = 3.14159265; long *p1 = &n; float *p2 = &f; double *p3 = &d; printf("%ld/n", *p1); printf("%g/n", *p2); printf("%.8f/n",*p3); getchar(); return 0; }
1. 数组的标志是 []:
#include <stdio.h> int main() { int nums[3]; nums[0] = 11; nums[1] = 22; nums[2] = 33; printf("%d, %d, %d", nums[0], nums[1], nums[2]); getchar(); return 0; }
2. 数组的大小和维数:
#include <stdio.h> int main() { int nums[10]; printf("数组大小是: %d/n", sizeof(nums)); printf("数组维数是: %d/n", sizeof(nums)/sizeof(nums[0])); getchar(); return 0; }
3. 遍历数组:
#include <stdio.h> int main() { int nums[10]; int i; for (i = 0; i < sizeof(nums)/sizeof(nums[0]); i++) nums[i] = i * i; for (i = 0; i < sizeof(nums)/sizeof(nums[0]); i++) printf("%d/n", nums[i]); getchar(); return 0; }
4. 对一维数组, 可以不指定维数, 它能自动识别:
#include <stdio.h> int main() { double ds[] = {1.1, 2.2, 3.3, 4.4}; int count = sizeof ds / sizeof ds[0]; int i; for (i = 0; i < count; i++) { printf("%.1f/n", ds[i]); } getchar(); return 0; }
4. 不指定维数的数组常常会用于字符串:
#include <stdio.h> int main() { char str1[] = "Builder"; /* 假如不怕麻烦可以这样初始化 */ char str2[8] = {'B','u','i','l','d','e','r','/0'}; unsigned i; for (i = 0; i < sizeof str1/sizeof str1[0]; i++) { printf("%c", str1[i]); } printf("/n%s", str1); printf("/n%s", str2); getchar(); return 0; }
5. 二维数组:
#include <stdio.h> int main() { int nums[3][4] = { {11,12,13,14}, {21,22,23,24}, {31,32,33,34} }; printf("%d,%d,%d/n", nums[0][2], nums[1][2], nums[2][2]); getchar(); return 0; }
5. 可以并只能省略第一个维数:
#include <stdio.h> int main() { int nums[][4] = { {11,12,13,14}, {21,22,23,24}, {31,32,33,34} }; printf("%d,%d,%d/n", nums[0][2], nums[1][2], nums[2][2]); getchar(); return 0; }
6. 多维数组:
#include <stdio.h> int main() { int nums[2][3][4] = { { {111,112,113,114}, {121,122,123,124}, {131,132,133,134} }, { {211,212,213,214}, {221,222,223,224}, {231,232,233,234} } }; printf("%d,%d,%d/n", nums[0][0][0], nums[1][1][1], nums[1][2][2]); getchar(); return 0; }
7. 多维数组也是可以并只能省略第一个维数:
#include <stdio.h> int main() { int nums[][3][4] = { { {111,112,113,114}, {121,122,123,124}, {131,132,133,134} }, { {211,212,213,214}, {221,222,223,224}, {231,232,233,234} } }; printf("%d,%d,%d/n", nums[0][0][0], nums[1][1][1], nums[1][2][2]); getchar(); return 0; }
8. 没有初始化的局部数组变量, 包含的是一堆垃圾值:
#include <stdio.h> int ns1[10]; /* 这个会初始化为空 */ int main() { int ns2[10]; /* 这个不会初始化 */ int i; for (i = 0; i < sizeof(ns1)/sizeof(ns1[0]); i++) printf("%d/n", ns1[i]); printf("------------/n"); for (i = 0; i < sizeof(ns2)/sizeof(ns2[0]); i++) printf("%d/n", ns2[i]); getchar(); return 0; }
9. 初始化数组为空其实很简单:
#include <stdio.h> int main() { int ns1[10] = {NULL}; /* 或 {0} */ int ns2[2][3][4] = {0}; int i; for (i = 0; i < sizeof(ns1)/sizeof(ns1[0]); i++) printf("%d/n", ns1[i]); printf("---------/n"); printf("%d/n", ns2[1][2][3]); getchar(); return 0; }
1. printf 枚举可显示枚举的序号:
#include <stdio.h> int main() { enum ABC{AAA,BBB,CCC}; enum ABC e1,e2,e3; e1 = AAA; e2 = BBB; e3 = CCC; printf("%d, %d, %d/n", e1, e2, e3); getchar(); return 0; }
2. 定义枚举时可同时定义变量:
#include <stdio.h> int main() { enum ABC{AAA,BBB,CCC} e1=BBB, e2=BBB+1, e3=e2-2; printf("%d, %d, %d/n", e1, e2, e3); getchar(); return 0; }
3. 同时定义变量时, 你甚至可以不要枚举名:
#include <stdio.h> int main() { enum {AAA,BBB,CCC} e=BBB; printf("%d/n", e); e++; printf("%d/n", e); getchar(); return 0; }
4. 可随意指定序号:
#include <stdio.h> int main() { enum ABC{AAA=2,BBB,CCC=9} e1, e2, e3; e1 = AAA; e2 = BBB; e3 = CCC; printf("%d, %d, %d/n", e1, e2, e3); getchar(); return 0; }
5. 序号重了都不要紧:
#include <stdio.h> int main() { enum ABC{AAA=2,BBB=2,CCC} e1, e2, e3; e1 = AAA; e2 = BBB; e3 = CCC; printf("%d, %d, %d/n", e1, e2, e3); getchar(); return 0; }