1.指针定义
指针,顾名思义,是定义的某类型指针指向相同类型的已知变量所在内存中的地址。 前加"&"xx表示得到xx的地址。
指针也就是内存地址,指针变量是用来存放内存地址的变量。
int main (){
int var_runoob = 10;
int *p; // 定义指针变量
p = &var_runoob;
printf("var_runoob 变量的地址: %p\n", p);
return 0;
}
2.用指针遍历一维数组
int main (){
int var[] = {10, 100, 200};
int i=0, *ptr;
/* 指针中的数组地址 */
ptr = var;
while(i<3){
printf("存储地址:var[%d] = %p\n", i, ptr );
printf("存储值:var[%d] = %d\n", i, *ptr );
/* 指向下一个位置 */
ptr++;
i++;
}
return 0;
}
3.指针数组
#include <stdio.h>
const int MAX = 3;
int main (){
int var[] = {10, 100, 200};
int i, *ptr[MAX];
for ( i = 0; i < MAX; i++){
ptr[i] = &var[i]; /* 赋值为整数的地址 */
}
for ( i = 0; i < MAX; i++) {
printf("%d", *ptr[i] );
}
return 0;
}
const int MAX = 4;
int main (){
const char *names[] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali",
};
int i = 0;
for ( i = 0; i < MAX; i++) {
printf("%s\n", i, names[i] );
} //注意char数组输出是什么
return 0;
}
4.多级指针——指向指针的指针
A Pointer → B Pointer → Data Variable
int main(){
int V;
int *Pt1;
int **Pt2;
V=100;
Pt1 = &V;
Pt2 = &Pt1;
//输出V的三种方式
printf("var = %d\n", V );
printf("*Pt1 = %d\n", *Pt1 );
printf("**Pt2 = %d\n", **Pt2); //注意怎么输出的
}
5.传递指针给函数
//传一维指针 easy
void getSeconds(unsigned long *par){
/* 获取当前的秒数 */
*par = time( NULL ); //可以将该指针传回去 虽然不在同一个作用域
return;
}
int main (){
unsigned long sec;
getSeconds( &sec ); //传的是地址~
/* 输出实际值 */
printf("Number of seconds: %ld\n", sec );
return 0;
}
6.函数返回指针
#include <stdio.h>
#include <stdlib.h>
/* 输入数组 */
int * getArray(){
static int r[10];
for(int i=0; i<10; i++){
scanf("%d",&r[i]);
}
return r;
}
/* 要调用上面定义函数的主函数 */
int main (){
/* 一个指向整数的指针 */
int *p;
p = getArray();
for (int i= 0; i < 10; i++){
printf("*(p + [%d]) : %d\n", i, *(p + i) );
}
return 0;
}
7.函数指针
就是将一个函数换成一个简单的名字【看得懂即可,写代码时尽量不用】
注意:需要把函数返回值和指针的类型统一
#include <stdio.h>
int max(int x, int y){
return x > y ? x : y;
}
int main(void){
/* p 是函数指针 */
int (* p)(int, int) = &max; // &可以省略
int a, b, c, d;
printf("请输入三个数字:");
scanf("%d %d %d", & a, & b, & c);
/* 与直接调用函数等价,d = max(max(a, b), c) */
d = p(p(a, b), c);
printf("最大的数字是: %d\n", d);
return 0;
}