每次指针加深一层,增加一个下标当作维度

a[i]        等价于      *(a + i)  一维数组,一级指针,1个*

a[i][j]       等价于      *(a[i] + j)    *(*(a + i) + j)    二维数组,二级指针,2个* 

a[i][j][k]     等价于      *(a[i][j] + k)   *(*(a[i] + j) + k)  *(*(*(a + i) + j) + k)    三维数组,三级指针,3个*

a[i][j][k][l]    等价于      *(a[i][j][k] + l)  *(*(a[i][j] + k) + l)    *(*(*(a[i] + j) + k) + l)    *(*(*(*(a + i) + j) + k) + l)    四维数组,四级指针,4个*

 

数组的指针,地址相同,但是指针类型不同

 

 1 #define _CRT_SURE_NO_WARNINGS
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 
 6 main1()
 7 {
 8     char str[5][10] = { "calc","notepad","tasklist","pause","mapaint" };
 9 
10     char(*p)[10] = str;
11 
12     printf("%x,%x,%x\n", str, &str, *str);//第一个指向字符串数组第一行的首地址,第二个指向字符串数组的首地址,第三个指向一个字符的首地址
13 
14     printf("%d,%d,%d\n", sizeof(*str), sizeof(*(&str)), sizeof(*(*str)));
15     
16     //指针地址一样,但是指针类型不一样
17     //str代表行地址, &str代表整个数组的地址, *str代表第一个字符的地址
18 
19     system("pause");
20 }
21 
22 main2()
23 {
24     int num = 10;
25     int *p1 = &num;
26     
27     double db = 10.9;
28     double *p2 = &db;
29 
30     printf("%d,%d\n", sizeof(p1), sizeof(p2));
31     
32     printf("%d,%d\n", sizeof(*p1), sizeof(*p2));
33 
34     system("pause");
35 }
36 
37 main()
38 {
39     int a[2][3] = { 1,2,3,4,5,6 };
40 
41     printf("%x,%x,%x\n", a, &a, *a);
42 
43     printf("%d,%d,%d\n", sizeof(*a), sizeof(*(&a)), sizeof(*(*a)));
44 
45     //a代表第一行的首地址, &a代表数组的首地址, *a代表第一个整型常量的首地址
46 
47     system("pause");
48 }

 

32位,指针就是4个字节

64位,指针占8个字节

 

一个指向整型数的指针 int*p

一个指向整型数指针的指针 int **p

一个有10个整型指针的数组 int *p[10]

一个指向有10个整型数数组的指针 int (*p)[10]

一个指向函数的指针,该函数有一个整型参数,并返回一个整型数 int ( *p)(int)

一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数,并返回一个整型数。 int(*p[10])(int)

一个指向函数指针的指针,所指向的函数有一个整型参数,并返回一个整型数。 int (**p)(int)

 

int a一个变量

int *p一个指向整数的指针

int **pp一个指向(指向整数的指针)的指针

 

int a[10]一个数组

int *p[10]一个数组,每一个元素都是指向整数的指针

int (*p)[10]一个指向有10个元素的数组的指针

 

int add(int a)

int (*p)(int )一个指向函数的指针

int (*p[10])(int )一个数组有10个指向函数的指针

 

 1 #include <stdio.h>
 2 
 3 main()
 4 {
 5     int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
 6     int i, j;
 7 
 8     for (i = 0;i < 3;i++)
 9     {
10         for (j = 0;j < 4;j++)
11         {
12             printf("%d,%x\n", *(*(a + i) + j), *(a + i) + j);
13         }
14     }
15     printf("\n");
16 
17     printf("%x\n", a);
18 
19     printf("%x\n", *a);
20 
21     printf("%x\n", &a);
22     
23     printf("%x\n", sizeof(a));//30
24 
25     printf("%x\n", sizeof(*a));//10
26 
27     printf("%x\n", sizeof(**a));//4
28 
29     printf("%x\n", sizeof(*&a));//30
30 
31     system("pause");
32 }
33 
34 main1()
35 {
36     int num[5] = { 1,2,3,4,5 };
37 
38     printf("%x\n", num);//第一个元素的首地址,4个字节
39 
40     printf("%x\n", *num);
41 
42     printf("%x\n", &num);//一个数组的首地址,20个字节
43 
44     printf("%d\n", sizeof(num));//20
45 
46     printf("%d\n", sizeof(*num));//4,根据类型地址取出内容
47 
48     printf("%d\n", sizeof(&num));//4
49 
50     printf("%d\n", sizeof(*&num));//20
51 
52     system("pause");
53 }

 

多线程查找

 

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 #include<windows.h>
 6 #include<process.h>
 7 
 8 int flag = 0;
 9 int *addrfind = NULL;
10 
11 struct MyStruct
12 {
13     int *pfindstart;//要查找的首地址
14     int length;//限定长度,从地址开始
15     int num;//要查找的数据
16     int bh;//线程编号
17     int *pflag;//传递flag的地址,修改flag
18     int **addr;//传递一个指针的地址
19 };
20 
21 void find(void *p)
22 {
23     struct MyStruct *pstruct = (struct MyStruct *)p;//指针类型转换
24 
25     for (int *px = pstruct->pfindstart;px < pstruct->pfindstart + 100;px++)//内存的遍历,从地址开始累加100个元素的大小,遍历所有元素
26     {
27         if (*(pstruct->pflag) != 0)
28         {
29             printf("%d线程\n", pstruct->bh);
30             return;
31         }
32 
33         if (*px == pstruct->num)
34         {
35             printf("第%d个线程找到%x,%d\n", pstruct->bh, px, *px);
36             *(pstruct->pflag) = 1;
37             *(pstruct->addr) = px;
38             return;
39         }
40     }
41     printf("第%d个线程没有找到\n", pstruct->bh);
42     return;
43 }
44 
45 main()
46 {
47     int a[1000];//寻找783
48     int i;
49 
50     for (i = 0;i < 1000;i++)//数组初始化
51     {
52         a[i] = i;
53     }
54 
55     struct MyStruct threaddata[10];//创建结构体数组,处理不同的线程
56 
57     for (i = 0;i < 10;i++)//创建10个进程并行查找
58     {
59         threaddata[i].pfindstart = a + i * 100;//要查找的首地址
60         threaddata[i].length = 100;//限定长度,从地址开始
61         threaddata[i].bh = i;//线程编号
62         threaddata[i].num = 783;//要查找的数据
63         threaddata[i].pflag = &flag;
64         threaddata[i].addr = &addrfind;
65         _beginthread(find, 0, &threaddata[i]);
66     }
67 
68     Sleep(30000);
69 
70     printf("%d,%x", *addrfind, addrfind);
71 
72     system("pause");
73 }

 

用指向指针的指针的方法对N个整数排序并输出。要求排序单独写成一个函数。N个整数和N在主程序中输入,最后在主函数中输出。

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 
 5 #define N 10
 6 
 7 void main()
 8 {
 9     time_t ts;
10     srand((unsigned int)time(&ts));
11     int arr[N] = { 0 };//初始化数组
12     int *p[N];//存放指针的数组
13     int **pp;//指向指针的指针
14     int i;
15     int j;
16     int temp;
17 
18     for (i = 0; i < N; i++)
19     {
20         arr[i] = rand() % 100;
21         printf("%5d", arr[i]);
22         p[i] = &arr[i];
23     }
24 
25     pp = &p;
26 
27     for (i = 0; i < N - 1; i++)
28     {
29         for (j = 0; j < N - 1 - i; j++)
30         {
31             if (**(pp + j)>**(pp + j + 1))
32             {
33                 temp = **(pp + j);
34                 **(pp + j) = **(pp + j + 1);
35                 **(pp + j + 1) = temp;
36             }
37         }
38     }
39 
40     printf("\n");
41     for (i = 0; i < N; i++)
42     {
43         printf("%5d", arr[i]);
44     }
45 
46     system("pause");
47 }