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

 指针运算:取值,自增,自减

猜你喜欢

转载自blog.csdn.net/f2157120/article/details/106848161