@SuHongjun
2020-04-30T11:35:01.000000Z
字数 2459
阅读 178
C语言
2020春季学期
最简单的指针定义的示例:
#include "stdio.h"
main()
{
int *p; //p就是一个指针变量,简称指针,指针变量定义的特征是 *
}
指针变量的基础用法:
#include "stdio.h"
main()
{
int a = 5;
int *p; //p就是一个指针,指针变量的特征是*; 指针首先是一个变量:名字p、类型是int *
p = &a; //指针赋值的基本方式1。指针的实质是地址,也就是内存单元的编号,让指针p指向变量a
printf("a: %d\n", a);
printf("p: %d\n", p);
printf("&a: %d\n", &a); // &a的值 等于p
printf("*p: %d\n", *p); // *p 表示 p所指向单元的内容。 因为p指向a, *p也就是a的值
*p = 9; //给指针所指赋值,因为p此时已经指向a,等价于 a = 9;
printf("a: %d\n", a); //输出9
//p = 9; //错误用法!!! 要避免给指针变量直接赋数值
}
#include "stdio.h"
main()
{
char a, *p1;
int b, *p2;
double c, *p3;
printf("char型变量a所占字节数:%d\n", sizeof(a));
printf("char型变量所占字节数:%d\n", sizeof(char));
printf("int型变量b所占字节数:%d\n", sizeof(b));
printf("int型变量所占字节数:%d\n", sizeof(int));
printf("double型变量c所占字节数:%d\n", sizeof(c));
printf("double型变量所占字节数:%d\n", sizeof(double));
printf("char * 型指针所占字节数:%d\n", sizeof(p1));
printf("int * 型指针所占字节数:%d\n", sizeof(p2));
printf("double * 型指针所占字节数:%d\n", sizeof(p3));
}
运行结果:
char型变量a所占字节数:1
char型变量所占字节数:1
int型变量b所占字节数:4
int型变量所占字节数:4
double型变量c所占字节数:8
double型变量所占字节数:8
char * 型指针所占字节数:4
int * 型指针所占字节数:4
double * 型指针所占字节数:4
//数组与指针基本用法示例1
#include "stdio.h"
main()
{
int i=9;
static int s=5;
int a[5]={1,2,3,4,5};
int *p;
p = &i; //指针赋值的基本方式1:让p指向变量 i
printf("p=%d\n",p);
p = a; //指针赋值的基本方式2:让p指向数组a的首地址,数组名本身就代表地址,相当于 p = &a[0];
printf("p=%d\n",p);
p = &s; //p指向静态变量s
printf("p=%d\n",p); //静态变量因为是分配在静态存储区,地址值和动态变量的地址值相差比较大
}
//数组与指针基本用法示例2
#include "stdio.h"
main()
{
int a[5]={1,2,3,4,5};
int *p;
p = &a[0]; //指针赋值的基本方式3:让p指向数组a的首地址,相当于 p = a;
printf("p=%d,\t *p = %d",p,*p);
p = a; //让p指向数组a的首地址,数组名本身就代表地址,相当于 p = &a[0];
printf("p=%d,\t *p = %d",p,*p);
}
输出为:
p=12253044, *p = 1
p=12253044, *p = 1
//数组与指针基本用法示例3
#include "stdio.h"
main()
{
int a[5]={1,2,3,4,5};
int *p;
p = a; //数组名就是地址, 让指针指向数组的首地址
//a = p; //非法!不允许,虽然数组名和指针都表示地址,但是指针值可以被修改,而数组名不能被修改
printf("%d\n", a[0]);
printf("%d\n", *p); //p此时指向a[0]
printf("%d\n", a[4]);
printf("%d\n", p[4]); //指针一旦指向数组之后,可以用下标的方式来引用数组元素
}
//数组与指针进阶内容1
#include "stdio.h"
main()
{
int a[5]={1,2,3,4,5};
int *p,i;
p = a; //数组名就是地址, 让指针指向数组的首地址
for(i=0; i<5; i++)
printf("%d\t", a[i]); //传统方式遍历数组
printf("\n");
for(i=0; i<5; i++)
printf("%d\t", p[i]); //指针方式1遍历数组,当指针指向数组之后,把指针按数组名的方式来用
printf("\n");
for(i=0; i<5; i++)
{
printf("%d\t", *p); //指针方式2遍历数组
p++; //p++的结果是让p指向下一个数组元素,因为每个数组元素占4个字节,所以p值实际上加了4 //指向int 型的指针,自增实际是跳4个字节(1个int所占的内存字节数)
}
printf("\n");
}
//数组与指针进阶内容2
#include "stdio.h"
main()
{
int a[5]={1,2,3,4,5};
int *p;
p = a;
printf("%d\n", *a); //输出1,也就是a[0],数组名也可以按照指针的方式来用(不能修改指向的指针)
printf("%d\n", *(p+2)); //输出3,也就是a[2], *(p+2)相当于a[2] ,也相当于*(a+2)
}
C语言的学习要注重阅读代码,尤其越到后面,阅读代码的作用越来越重要。