声明两个变量,其中整形变量i占两个字节,字符型a占一个字节。
int i; char a;
实际在内存中的映像如图
赋值给变量,即是将该值赋给相应的地址中
i=30; a='t';
如此,我们可以通过代码打印查看变量与它的地址
#include指针int main () { int i = 39; printf ("%dn" , i); printf ("%dn", &i) ; return(0) ; }
声明指针变量pi
int *pi;
则内存映射为
可以看出pi不过是在内存的某个地方声明一个一定宽度的内存空间。
将变量i的地址编号赋给pi指针
pi=&i;//i的地址为6、7
现在的情况就是:i是一个变量,pi指向了变量i,pi是i变量的地址编号相当于&i,而*pi则是读取i的存储的地址的值。
使用代码打印进行对比
#includeint main () { int i = 39; int *pi; pi=&i;//i的地址为6、7 printf ("--值--n", &i) ; printf ("%dn" , i); printf ("%dn", *pi) ; printf ("--地址--n", &i) ; printf ("%dn", &i) ; printf ("%dn", pi) ; return(0) ; }
所以我们可以通过改变指针pi来改变所指的地址内的变量值。
char a , *pa; a=10; pa = &a; *pa = 20;通过数组名访问数组元素
使用数组名(首地址)和普通方式访问数组元素,效果一致
#include通过指针访问数组元素int main () { int i, a[] = { 3,4,5,6,7,3,7,4,4,6}; for (i = 0; i <=9; i++) printf("%dn", * (a+i) ); printf("--数组元素--n"); for (i = 0; i <=9; i++) printf("%dn", a[i] ); return(0) ; }
#include数组名与指针变量的区别int main () { int i, *pa,a[] = { 3,4,5,6,7,3,7,4,4,6}; pa=a; for (i = 0; i <=9; i++) printf("%dn", pa[i] ); printf("--赋值数组名--n"); for (i = 0; i <=9; i++) printf("%dn",*(pa+i) ); return(0) ; }
数组名与指针变量还是有所区别的,数组名只是一个指针常量,而指针是指针变量。
#includeint main () { int i,*pa,a[]= {3,4,5,6,7,3,7,4,4,6}; pa =a; for (i = 0; i <=9; i++) { printf("%dn",*pa); pa++; } return(0) ; }
上述代码中,pa换成a是无法正常编译的
const int iconst声明定义的称为符号常量,后期不能进行修改其值。有两种写法:
const int ic = 20;//等同于 int const ic = 20;
const定义的*pi是不可修改的,但是pi是可以修改的
#includeint *const pi与int const *piint main () { int il = 30; int i2 = 40; const int *pi = &il; pi = &i2; i2 = 80; printf("%dn",*pi); return(0); }
int *const pi,可以改变*pi,不能改变pi int const *pi,可以改变pi,不能改变*pi
#includeint main () { int il = 30; int i2 =40; int *const pi = &il; il = 80; printf("%d",*pi); return(0); }



