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)
指向二维数组元素的指针:
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; //第二行第二个元素地址
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地址传递
9题目
无法将数组 a 的地址赋给 a :在 C 语言中,一旦定义了一个数组,它的大小和存储位置都是固定的,无法更改。因此,将 a 的地址赋给 a 是不合法的操作。
注意*(p++)和 *p++的区别:前者p指针会先往后移动一位,后者先输出p指针目前所指向的值
修改:第三题答案应该是C,指针已经变动了