数据类型 - 数组与指针 (转自万一老师)

1. 获取数组的地址无须 &, 因为数组名本身就是个地址
#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 = &num;

    printf("%d, %p/n", num, p);
    
    getchar();
    return 0;
}

  
  

3. *指针 就如同变量本身是一样的:
#include <stdio.h>

int main()
{
    int num = 10;
    int *p = &num;

    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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值