&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
指针运算:取值,自增,自减