C语言基础_高级指针

一、结构体指针

1)结构体指针 指针指向结构体的存储单元 先对结构体的变量取地址

2)p指向结构体的起始地址 就是首个成员变量的地址

typedef struct teacher{
    char name[20];
    int age;
}Teacher;
int main(int argc, const char * argv[]) {
    Teacher t1 = {"laoluo",20};
    Teacher *p = &t1;
    printf("p = %p,name = %p,age = %p\n",p,t1.name,&t1.age);
return 0;
}

3) 通过结构体指针访问成员变量

(*P).name    (*p):p指向结构体的存储单元

typedef struct teacher{
    char name[20];
    int age;
}Teacher;
int main(int argc, const char * argv[]) {

    Teacher t2 = {"hahazheng",23};
    Teacher *p1 = &t2;
    strcpy((*p1).name, "memeda");
    (*p1).age = 24;
    printf("%s %d\n",(*p1).name,(*p1).age);
    return 0;
}

4) 通过箭头访问 p -> name;

typedef struct teacher{
    char name[20];
    int age;
}Teacher;
int main(int argc, const char * argv[]) {

    Teacher t3 = {"heheda",22};
    Teacher *p1 = &t3;
    p1 -> age = 20;
    printf("%s %d\n",p1->name,p1->age);

    return 0;
}

5) 求坐标两点之间的距离

typedef struct cpoint{
    float x;
    float y;
}CPoint;
float TwoPoint(CPoint *ps,CPoint *pd){
    float dx = ps->x - pd->x;
    float dy = ps->y - pd->y;
    float dz = sqrtf(dx*dx + dy*dy);
    return dz;

}
int main(int argc, const char * argv[]) {

    CPoint m ={0.0,4.0};
    CPoint n = {3.0,0.0};
    CPoint *ps = &m;
    CPoint *pd = &n;

    printf("两点之间的距离为:%f",TwoPoint(ps, pd));
    return 0;
}

6)字符串操作

typedef struct student{
    int number;
    char name[20];
    char gender;
    float score;
}Student;

int main(int argc, const char * argv[]) {

    Student stu = {1,"lan ou",‘m‘,95.6};
    Student *pl = &stu                ;
    int length = (int)strlen(pl->name);
    for (int i =0; i < length ; i++) {
        if (i == 0 && (*(pl->name) >=‘a‘ && *(pl->name)<=‘z‘)){
 //pl->name拿到name字符串 因为自己字符串本身是有地址的  [Student *pl = &stu][拿到首地址] 所以(*(pl->name))就是拿到字符串的首地址(首字母)
            *(pl->name) = *(pl->name) - 32;
        }
        if (*((pl->name)+i) == ‘ ‘) {
            *((pl->name)+i) =‘_‘;
        }
    }
    printf("%s\n",pl->name);
    return 0;

}

二、结构体数组

typedef struct student{
    char name[20];
    int age;
    char gender;
    float score;

}Student;
int main(int argc, const char * argv[]) {

Student stu3[3] = {{"liubei",100,‘m‘,23},{"guanyu",17,‘m‘,90},{"zhangfei",18,‘m‘,78}};
    Student *ss = stu3;
    printf("%s\n",stu3[0].name);
    printf("%s\n",ss[0].name);
    printf("%s\n",ss->name);
    printf("%f\n",(*(ss+1)).score);
    printf("%d\n",(*(ss+2)).age);
    printf("%f\n",(ss+2)->score);
    printf("%d\n",(int)sizeof(Student));
    for (int i =0; i<3; i++) {
        printf("%s %d %c %.2f\n",(ss+i)->name,(ss+i)->age,(ss+i)->gender,(ss+i)->score);
    }
    return 0;
}

三、结构件指针作为函数参数

typedef struct person{
    char name[20];
    int age;
    char gender;
    float weight;
}Person;
typedef struct student{
    char name[20];
    int age;
    char gender;
    float score;

}Student;
void maxWeight(Person *p3,Person *p4){
    Person *max = p3->weight > p4->weight ? p3:p4;//p3 p4指向结构体的起始地址 就是首个成员变量的地址 所以再将它赋值给新的指针变量时 并不需要重新获得地址
    printf("%s %d %c %.2f\n",max->name,max->age,max->gender,max->weight);
}
int main(int argc, const char * argv[]) {

    Person p1 = {"gailun",18,‘m‘,110};
    Person p2 = {"liqing",30,‘m‘,125};

    Person *p3 = &p1;
    Person *p4 = &p2;
    maxWeight(p3, p4);

    Student stu1 = {"chengmanxiang",27,‘f‘,99};
    Student *s = &stu1;
    (*s).age = 18;
    s->gender = ‘m‘;
    printf("%c\n",(*s).gender);
    printf("%s\n",s->name);

    return 0;
}

四、结构体数组作为函数参数

typedef struct student{
    char name[20];
    int age;
    char gender;
    float score;

}Student;
void printStudent(Student *stu,int n){
    for (int i =0; i<n; i++) {
        if(((stu+i)->gender) != ‘f‘){
            ((stu+i)->gender) = ‘f‘;
        }
    printf("%s %d %c %f\n",(stu+i)->name,stu[i].age,(*(stu+i)).gender,(stu+i)->score);
    }
    printf("/////////////////////////////////////\n");
    //按年龄排序
    for (int i = 0; i < n-1; i++) {
        for (int j =0; j< n-1-i; j++) {
            if ((stu+j)->age > (stu+j+1)->age) {
                Student temp = stu[j];
                stu[j] = stu[j+1];
                stu[j+1] = temp;
            }
        }
    }
    for (int i =0; i<n; i++) {
    printf("%s %d %c %f\n",(stu+i)->name,stu[i].age,(*(stu+i)).gender,(stu+i)->score);
    }
    printf("/////////////////////////////////////\n");
}

int main(int argc, const char * argv[]) {

    Student stu4[4] = {{"kate",18,‘f‘,65},{"yasuo",30,‘m‘,400},{"zelasi",29,‘?‘,30},{"guafu",23,‘f‘,89}};
    Student *stu = stu;//为什么没有取地址符&  因为数组本身是有地址的 stu指向首个成员变量的地址
    printStudent(stu4, 4);

    return 0;
}
时间: 2024-11-03 21:51:21

C语言基础_高级指针的相关文章

C语言基础_函数指针

一.函数  实现某特定功能的代码 1)函数名与数组名一样是地址 2)函数指针 指向函数的指针 可以通过函数指针调用指向的函数 3)返回值类型 (*函数指针名)(参数类型)  = 函数名 int maxValue(int a,int b){ return a > b ? a : b; } int (*p)(int,int) = maxvalwe; printf("%d\n",p(3,4)); //用指针去调用函数 4) 示例代码 int maxValue(int a,int b){

C语言基础_排序

一.C语言基础 1)冒泡排序 int array[10] = {1,6,3,4,5,7,7,8,9,10}; for (int j = 0; j < 9; j++) { for (int i=0; i<9-i; i++) { if (array[i] > array[i+1]) { array[i] = array[i] ^ array[i+1]; array[i+1] = array[i] ^ array[i+1]; array[i] = array[i] ^ array[i+1];

C语言基础_指针

一.指针变量 1.存储地址的变量 2.* 间接寻址符 3.%p 打印地址的格式字符 4.& 取地址符 获取变量的存储单元地址 5.int *p = &a p指向a的存储单元  [p就是一个指针  存储地址的变量] 6.*p 通过地址访问变量的存储单元(内容) 二.指针 int a[5]={3,4,1,2,5}; int *p = a;//定义一个指针指向首地址 printf("p[2] = %d\n",p[1]); printf("%d\n",*(p

C语言基础知识【指针】

2017年7月11日18:33:41C指针  该看地址:http://www.runoob.com/cprogramming/c-pointers.html1.学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的.正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址.请看下面的实例,它将

python基础_高级变量类型

高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型整型 ( int)浮点型( float)布尔型( bool)真 True 非 0 数 -- 非零即真假 False 0复数型 ( complex)主要用于科学计算,例如:平面场问题.波动问题.电感电容等问题 非数字型字符串列表元组字典 在 Python 中,所有 非数字型变量 都支持以下特点:????都是一个 序列 sequence,也可以理解为 容器???

黑马程序员--C语言基础--指针

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- /* 1.指针的定义格式: 数据类型 *指针变量名 2.指针的赋值: 指针变量内存储的是指针所指向变量的地址 指针变量名=&... 或者 指针变量名 =数组名 注意:定义的时候 * 仅代表这是在定义一个指针变量,没有其他的意义 *

Coursera_程序设计与算法_计算导论与C语言基础_数组应用练习

您也可以在我的个人博客中阅读此文章:跳转 编程题#1:求字母的个数 描述 在一个字符串中找出元音字母a,e,i,o,u出现的次数. 输入 输入一行字符串(字符串中可能有空格,请用gets(s)方法把一行字符串输入到字符数组s中),字符串长度小于80个字符. 输出 输出一行,依次输出a,e,i,o,u在输入字符串中出现的次数,整数之间用空格分隔. ##样例输入If so, you already have a Google Account. You can sign in on the right

iOS开发之c语言基础Lesson-11 函数指针 上课笔记 与 试题练习

main.m 文件 9 #import <Foundation/Foundation.h> 10 #import "Pointer.h" 11 ////////////////Lesson 11 函数指针 课堂笔记 与 习题练习//////////// 12 13 14 //函数指针:指向函数的指针叫做函数指针,用来存储函数的地址 15 //函数名代表函数的入口地址 16 17 18 //回调函数; 函数指针变量,存储对应的函数的地址 19 //给函数指针类型,取一个新的名

No.1 java语言基础_学习笔记

import java.util.Scanner; public class HelloWorld { static final double PI=3.14; static int x=125; /** * 文档注释,程序名称:HelloWorld * 开发时间:2016-03-07 * 作者:嘿嘿 * */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.printl