数据结构学习 的 ”预备知识“ 之 “指针” “数组” “结构体”
学习目标:
- 掌握指针变量
学习内容:
首先复习C的指针:
#include<stdio.h>
int main()
{
int *p;
int i = 10;
int j;
p = &i;
j = *p;//等价于J=i;
printf("i= %d ,j = %d ,*p = %d", i,j,*p);
return 0;
}
若要修改局部变量则需要用到指针 如:
#include<stdio.h>
void f(int *p);//函数声明
int main()
{
int i = 9;
f(&i);
printf("i= %d ", i);
return 0;
}
void f(int * i) {
*i = 100;
}
**
一维数组是一个指针常量,存放的是一维数组第一个元素的地址 它(数组名)的值不能被改变 一维数组名指向的是数组的第一个元素
**
int a[5] = { 1,2,3,4,5 };//其中a 指向 1
数组知识:
输出数组的值的函数(方法):
#include<stdio.h>
void ShowArray(int *p ,int len) {
int i = 0;
for (; i < len; i++) {
printf("%d", p[i]);
}
}
int main()
{
int a[5] = { 1,2,3,4,5 };
ShowArray(a, 5);//用数组名和数组长度定义数组来输出
return 0;
}
修改数组的值
#include<stdio.h>
int main()
{
int i = 0;
int a[5] = { 1,2,3,4,5 };
a[4] = *(3+a);//修改a[4],**指针与下标的关系(还需后续理解)**
printf("%d\n", a[4]);
for (; i < 5; i++) {
printf("%d", a[i]);
}
return 0;
}
输出数组的地址
#include<stdio.h>
int main()
{
int i = 0;
int a[5] = { 1,2,3,4,5 };
for (; i < 5; i++) {
printf("%p\n",a+i);
//printf("%p\n",a[i]);(**a[i]为int类型的变量,不能用%p来输出**)
printf("%d\n",a);
}
return 0;
}
从输出结果来看:1 . a 为指针并且指向数组的第一个元素
2 . 数组的地址都是连续的
进阶指针知识:
#include<stdio.h>
int main()
{
double * p;
double x = 66.6;
p = &x;//x占8个字节 一个字节是8位 一个字节一个地址
//p存放了一个地址,为第一个字节的地址
double arr[3] = {1.1,2.2,3.3};
double* q;
q = &arr[0];
printf("%p\n", q);//%p以 16进制 输出
q = &arr[1];
printf("%p\n", q);//与第一次输出相差8
return 0;
}
要熟练掌握进制转换!!!!
结构体
是一个数据类型为struct student
第一种访问结构体的方式为st. 但是在数据结构中通常不用此方法
#include<stdio.h>
#include<string.h>
struct Student {
int sid;
char name[200];
int age;
};
int main()
{
struct Student st = { 1000,"zhangsan",20 };
printf("%d %s %d\n",st.sid, st.name, st.age);
st.sid = 99;
strcpy_s (st.name, "lisi");//这里要注意,应使用strcpy_s,且不能直接用st.name修改string
st.age = 22;
printf("%d %s %d\n", st.sid, st.name, st.age);
}
第二种方式为先创建一个pst指针 使用 pst->sid;
#include<stdio.h>
#include<string.h>
struct Student {
int sid;
char name[200];
int age;
};
int main()
{
struct Student st = { 1000,"zhangsan",20 };
struct Student* pst;
pst = &st;
pst->sid = 99; //past->sid等价于(*pst).sid 等价于st.sid;
//pst->name = "lisi"; error
strcpy_s(st.name, "lisi");//有问题
pst->age = 123;
printf("%d %s %d\n", st.sid, st.name, st.age);
}
}
第三种方法用函数
Ps.这里向void g(struct Student *pst);中传递指针,更加节约空间
#include<stdio.h>
#include<string.h>、
void f(struct Student *pst);
void g(struct Student* pst);
struct Student {
int sid;
char name[200];
int age;
};
int main()
{
struct Student st;
f(&st);
g(&st);
return 0;
}
void f(struct Student * pst) {
pst->sid = 99;
strcpy_s(pst->name, "zhansgan");
pst->age = 22;
}
void g(struct Student * pst) {
printf("%d %s %d\n", pst->sid, pst->name, pst->age);
}