1.二级指针
2.数组指针
3.指针数组
4.函数指针
二级指针
1.arr,&arr,&arr[0]的区别和联系
int main() {
int arr[3] = { 0 };
printf("arr=%p ,&arr[0]=%p ,&arr=%p ", arr, &arr[0], &arr);
}
共同点:指向的都是数组首元素的地址
不同点:1.
int* p1 = &arr;(error)
int* p2 = arr;(right)
int* p3 = &arr[0];(right)
2.p++:能力不一样
二级指针
int a=10;
int*p =&a;(基类型是int 所以指针类型是int *)
int* *q=&p;(基类型是int*,所以指针类型是int**)
*q=p;(解引用一次:指向p)
p=&a; *p=a;
*q=&a;
**q=a;
int main() {
int a = 10, b = 20;
int* p = &a, * q = &b;
int** p1 = &p, ** p2 = &q;
printf("a=%d,b=%d\n", *p, *q);
printf("a=%d,b=%d\n", **p1, **p2);
printf("&a=%p,&b=%p\n", p, q);
printf("&a=%p,&b=%p\n", *p1, *p2);
p1 = &q;
*p1= &a;
**p1 = 20;
p2 = &p;
*p2 = &b;
**p2 = 10;
printf("a=%d,b=%d\n", *p, *q);
printf("a=%d,b=%d\n", **p1, **p2);
printf("&a=%p,&b=%p\n", p, q);
printf("&a=%p,&b=%p\n", *p1, *p2);
}
通过结果更进一步了解二级指针
数组指针
指向一个数组的指针类型
1.int (*p)[3]=&arr;//指向的是int[3]数组
int main() {
int arr[4] = { 1,2,3,4 };
int(*p)[4] = &arr;
printf("p=%d,p+1=%d\n", p, p + 1);
int* q = &arr[0];
printf("q=%d,q+1=%d\n", q, q + 1);
int* r = arr;
printf("r=%d,r+1=%d\n", r, r + 1);
}
所以&arr指针加一跨越n(数组长度)*(基类型)个字节
而&arr[0]==arr -->+1后跨越1*基类型个字节
2.对数组指针的重命名(typedef)
unsigned long long int a=10;
typedef +类型名+变量名:就可以让变量名变成类型名;
typedef unsigned long long int a;
a b=10;//a 就不是变量名,实际是一个unsigened long long int 的数据类型
int arr[5]={1,2,3,4,5};
int (*p)[5]=&arr;--->int [5] (*p)=&arr;--->基类型是int [5]-->指针类型 int [5] (*x);
typedef int (*x)[5] ;-->x其实就是一个数组指针的类型;
x s=&arr;
3.使用数组指针遍历一维数组
#include<stdio.h>
int main() {
int arr[3] = { 1,2,3 };
int(*p)[3] = &arr;
for (int i = 0; i <= 2; i++) {
printf("%d\n", (*p) + i);
printf("%d\n", (( * *p)+i));
}
}
使用数组指针去遍历二维数组(2.0)
int main() {
int arr[2][3] = { {1,2,3},{4,5,6} };
for (int i = 0; i <=1; i++) {
for (int j = 0; j <=2; j++) {
printf("%d", arr[i][j]);
}
}
}
我们现在使用数组指针去遍历二维数组
int main() {
int arr[2][3] = { {1,2,3},{4,5,6} };
for (int i = 0; i <=1; i++) {
for (int j = 0; j <=2; j++) {
printf("%d",* (*(arr + i) + j));
}
}
指针数组
元素类型是指针的数组
const char*arr[3]={"abc","123","qaz"};
arr[0]="abc";
arr[1]="123";
arr[2]="qaz";
*arr[0]='h'-->error
上述无法改变字符串中的值;
char brr[][4]={"abc","qaz","wsx"};
//可以实现字符串中字符的改变
//列数>=字符串长度+1('\0')
全局变量和局部变量:
作用域不一样:全局变量:整个项目里面都是可以访问的 --》使用extern +全局变量;存储的位置是.data 数据区
局部变量:函数内定义的,函数内是有效的,出了就废了
存储位置:栈区
函数指针:定义一个指针指向函数
函数名含有:函数名的入口地址
函数指针类型 p =&func();
double func (int a,int b); typedef double (*func) (int a,int b);--->函数指针类型,落脚点是指针
字符串操作 stdin 键盘-->文件 stdout 文件->屏幕
字符:scanf("%c",&a); printf("%c",a);
char value =getchar(); putchar(value);
getc();-->返回的是所输入字符的ASCII值 putc(value,stdout);
char value =getc(stdin);
字符串:strncmp
strncpy
strncat
strnlen
scanf("%s",arr); printf("%s",arr);
get_s() put_s()
fgets() fputs()