C語言基礎 -34 指針_指針運算

&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

 指針運算:取值,自增,自減

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章