&q ---- 0x4000
q ----> 0x3000 --- &p
*q ---> *(&p) ---> p --- 0x2000
**q ---> *(*q) ---> *p ---> 1
*p: 取指針p指向的地址單元裏面的值
book@100ask:~/C_coding/CH01$ cat pointer3.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = NULL;
*p = 1;
printf("%d\n",*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ ./pointer3
Segmentation fault (core dumped)
NULL是零號地址,空,不分配給任何空間,*p = 1, 寫指針,必定報段錯誤。
野指針:指針沒有確定的指向
指針一旦定義出來,就要有一個確定的指向,如果沒有,該指針就應該寫成空值;只有確定了指針要指向某一變量,然後再來給他指定一個確定的空間
空類型指針: void *p = NULL
空類型的指針是百搭數據類型,任何類型的指針值都能夠賦值給void *,void *也可把當前值賦值給任意類型的指針。
book@100ask:~/C_coding/CH01$ cat pointer2.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 1;
int *p = &i;
int **q = &p;
printf("%d\n",sizeof(i));
printf("%d\n",sizeof(p));
printf("i = %d\n",i);
printf("&i = %p\n",&i);
printf("p = %p\n",p);
printf("&p = %p\n",&p);
printf("*p = %d\n",*p);
printf("q = %p\n",q);
printf("*q = %p\n",*q);
printf("**q = %d\n",**q);
exit(0);
}
book@100ask:~/C_coding/CH01$ ./pointer2
4
8
i = 1
&i = 0x7fff98d941b4
p = 0x7fff98d941b4
&p = 0x7fff98d941b8
*p = 1
q = 0x7fff98d941b8
*q = 0x7fff98d941b4
**q = 1
book@100ask:~/C_coding/CH01$ cat arr.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[3];
int i;
int *p = a;
for(i = 0 ; i < sizeof(a)/sizeof(*a); i++)
scanf("%d",p++);
for(i = 0 ; i < sizeof(a)/sizeof(*a); i++,p++)
printf("%d\n",*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ make arr
cc arr.c -o arr
book@100ask:~/C_coding/CH01$ ./arr
1
2
3
944969728
713826545
-619804784
book@100ask:~/C_coding/CH01$ cat arr.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[3];
int i;
int *p = a;
for(i = 0 ; i < sizeof(a)/sizeof(*a); i++)
printf("%p -> %d\n",&a[i],a[i]);
for(i = 0 ; i < sizeof(a)/sizeof(*a); i++)
scanf("%d",p++);
for(i = 0 ; i < sizeof(a)/sizeof(*a); i++)
printf("%p -> %d\n",p,*p++);
exit(0);
}
book@100ask:~/C_coding/CH01$ make arr
cc arr.c -o arr
book@100ask:~/C_coding/CH01$ ./arr
0x7fff5c351a2c -> 21871
0x7fff5c351a30 -> 1546984224
0x7fff5c351a34 -> 32767
1
2
3
0x7fff5c351a3c -> 898832640
0x7fff5c351a40 -> 1465531683
0x7fff5c351a44 -> -1660860448
上面代碼,在以下語句執行完畢後,P指針的範圍已經指向p賦值以外的空間。
for(i = 0 ; i < sizeof(a)/sizeof(*a); i++)
scanf("%d",p++);
在輸出去,加一句指針重定位,p=a,則可發現,scanf輸入的值可以正常輸出。
book@100ask:~/C_coding/CH01$ cat arr.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[3];
int i;
int *p = a;
for(i = 0 ; i < sizeof(a)/sizeof(*a); i++)
printf("%p -> %d\n",&a[i],a[i]);
for(i = 0 ; i < sizeof(a)/sizeof(*a); i++)
scanf("%d",p++);
p=a;
for(i = 0 ; i < sizeof(a)/sizeof(*a); i++,p++)
printf("%p -> %d\n",p,*p);
exit(0);
}
book@100ask:~/C_coding/CH01$ make arr
cc arr.c -o arr
book@100ask:~/C_coding/CH01$ ./arr
0x7ffea8ee93ec -> 21928
0x7ffea8ee93f0 -> -1460759328
0x7ffea8ee93f4 -> 32766
1
2
3
0x7ffea8ee93ec -> 1
0x7ffea8ee93f0 -> 2
0x7ffea8ee93f4 -> 3
數組名是常量
指針:變量,隨時可以發送變化
如下:匿名數組
book@100ask:~/C_coding/CH01$ cat a1.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = (int [3]){1,2,3};
int i;
for(i=0 ; i < 3; i++)
printf("%p -> %d\n",&p[i],p[i]);
}
book@100ask:~/C_coding/CH01$ make a1
cc a1.c -o a1
book@100ask:~/C_coding/CH01$ ./a1
0x7ffd36f4696c -> 1
0x7ffd36f46970 -> 2
0x7ffd36f46974 -> 3
book@100ask:~/C_coding/CH01$ cat a2.c
#include <stdio.h>
int main()
{
int a[] = {5,1,7,2,8,3};
int y;
int *p = &a[1];
y =(*--p)++;
printf("y = %d\n",y);
}
book@100ask:~/C_coding/CH01$ make a2
cc a2.c -o a2
book@100ask:~/C_coding/CH01$ ./a2
y = 5
book@100ask:~/C_coding/CH01$ cat a2.c
#include <stdio.h>
int main()
{
int a[] = {5,1,7,2,8,3};
int y;
int *p = &a[1];
y =(*--p)++;
printf("y = %d\n",y);
printf("a[0] = %d\n",a[0]);
}
book@100ask:~/C_coding/CH01$ make a2
cc a2.c -o a2
book@100ask:~/C_coding/CH01$ ./a2
y = 5
a[0] = 6
指針運算:取值,自增,自減