指针C语言

1指针方式

1.int a,*p=&a;
2. int a;
   int *p=&a;

特点:
1.指针变量与类型无关,在TC占2字节,在VC下占四字节

2.指针变量的引用

1.直接引用
2.间接引用
注意*的运算对象必须为地址

*p+=1; //相当于取p指针指向的值然后+1
int a=2,b=3,t;
int *p=&a,*q=&b;
t=*p; //交换指针所指向的值
*p=*q;
*q=t;

注意野指针
指针应该先赋值后引用

int *p;
*p+=1; //错误

3二级指针

int a=2,*p=&a,**q=&p; //等价于q->p->a,q存储了p的地址
int *p=*q; //可以得到q所指向的指针地址
//例子:
*p+**q=? //4

4指针与一维数组

1.数组特点: 在内存中存储的是连续的存储空间;一维数组名即代表一维数组的首地址(首元素地址)
数组名不可改变,是个地址!
1.一维数组元素地址的表示方式:

&a[i]; //表示a数组中第i+1个元素
a+i; //a数组名即代表首元素地址
//引入scanf
scanf("%d",&a[i]);//对数组元素进行赋值

2.注意事项
那如果是char字符串数组呢

scanf("s",a); //注意与gets的区别,scanf遇到空格会退出,将空格以及空格之后的元素进入缓冲区
gets(s); //会捕获到空格
//例子,输入ab cd回车:str1读到空格终止为ab,而ch1读取到缓冲区的字符' ',ascll为32
//gets继续读取到缓冲区的内容cd,ch2读取到回车,ascll为100
char str1[100];
	char str2[100];
	char ch1;
	char ch2;
	scanf("%s", str1);
	ch1=getchar();
	gets(str2);
	ch2=getchar();
	printf("str1:%s\n", str1);
	printf("ch1:%d is %c\n", ch1,ch1);
	printf("str2:%s\n", str2);
	printf("ch2:%d\n", ch2);

3.实际案例

int a[5]={1,2,3,4,5},*p;
for(p=a;p<a+5;p++){
   printf("%d",*p); //指针p指向数组的首地址,每次往后移动一位
}

int *q=a;
*p++;//输出为1;
*++p;//输出为2,p指针先往后移动一位再*取值
++*p;//输出为2,p指针先取值为1然后++;

5指针与二维数组

1特点: 二维数组名即为 数组的行地址(行指针)
注意二维数组省行不省列

int a[][4];//这是没问题的

*a;//为第一行
*(a+1)=a[1];//为第二行
int *p=a[1];//相当于p指针指向a的第二行首地址

2如何得到具体元素?

1.&a[i][j] //元素地址
a[i][j];// 元素
2.*(a+i)+j //元素地址 ——>*()==[]
所以*(a+i)+j==a[i]+j;
*(*(a+i)+j) //元素
3.a[i]+j //元素地址——>a[i]+j==*(a+i)+j 
*(a[i]+j) //元素

3.测试

int a[3][3]={1,2,3,4,5,6,7,8,9};
1.**a;// 得到第一个元素1
2.*a[1]; //==*(a[1]+0);等价于第二行元素的第一个
还可以写为*(a+1)+0
3.*(*(a+2)+2); //相当于取第三行第三个元素 ==a[2][2]
*(a[2]+2)

指针C语言_第1张图片
指向二维数组元素的指针:

int a[3][3]={1,2,3,4,5,6,7,8,9};
int m,*p=&a[0][0]; //将a数组的第一个元素地址赋值给p指针——>也可以是*p=a[0]:得到第一行第一个元素:*p=*(a+0)+0
m=*p; //*p得到a数组的第一个元素a[0][0]
m=m*(*(p+2))*(*(p+4)));//前一项是p指针+2指向3得到元素3,后一项为往后移动4位*(p+4)得到元素5:3*5=15

int a[3][3];
int*p=a[1]+1; //第二行第二个元素地址

指针C语言_第2张图片

6指针数组

本质为数组,数组的每个元素存储的是指针变量,故存储的是地址

int *a[5]; //指针数组
a[0]~a[4]; //每个元素为int类型的指针变量

int a[3]={1,2,3};
int b[2]={1,2};
//将ab的地址存储到指针数组中
int *p[2]={a,b};
//获取指针数组中指针变量所指向的元素值
int m=*(p[0]+1); //2
int n=*(p[1]+2); //先得到b数组地址然后往后首地址+2,*()得到元素值

7数组指针

本质为指针,目的:指向一个一维数组(行指针),p指针类型必须与数组类型一致

int*p[3]; //p为指针名,该指针指向一个具有三个元素(三列)的数组指针
int a[2][3];
p=a;
p[1][1]

8地址传递

指针C语言_第3张图片

9题目

指针C语言_第4张图片
指针C语言_第5张图片

无法将数组 a 的地址赋给 a :在 C 语言中,一旦定义了一个数组,它的大小和存储位置都是固定的,无法更改。因此,将 a 的地址赋给 a 是不合法的操作。
指针C语言_第6张图片
注意*(p++)和 *p++的区别:前者p指针会先往后移动一位,后者先输出p指针目前所指向的值

修改:第三题答案应该是C,指针已经变动了
指针C语言_第7张图片
指针C语言_第8张图片

指针C语言_第9张图片

你可能感兴趣的:(c语言,开发语言)