1、指针操作
# include <stdio.h>
int main(void)
{
int * p; //p是个变量名字, int * 表示该p变量只能存储int类型变量的地址
int i = 10;
int j;
p = &i;
*p = i; // 等价于 i = i;
j = *p; // 等价于 j = i;
printf("i = %d, j = %d, *p = %d\n", i, j, *p);
return 0;
}
2、函数之间的传值
# include <stdio.h>
void f(int * p) //不是定义了一个名字叫做*p的形参, 而是定义了一个形参,该形参名字叫做p,它的类型是int *
{
*p = 100; //
}
int main(void)
{
int i = 9;
f(&i);
printf("i = %d\n", i);
return 0;
}
3、数组与指针的关系
# include <stdio.h>
void Show_Array(int * p, int len)
{
int i = 0;
for (i=0; i<len; ++i)
printf("%d\n", p[i]);
//p[2] = -1; //p[0] == *p p[2] == *(p+2) == *(a+2) == a[2]
//p[i]就是主函数的a[i]
}
int main(void)
{
int a[5] = {1,2,3,4,5};
Show_Array(a, 5); //a等价于&a[0], &a[0]本身就是int *类型
//printf("%d\n", a[2]);
return 0;
}
4、
# include <stdio.h>
int main(void)
{
double * p;
double x = 66.6;
p = &x;//x占8个子节1个字节是8位,1个子节一个地址
double arr[3]={1.1, 2.2 , 3.3};
double *q;
q = &arr[0];
printf("%p\n",q);//%p实际就是以十六进制输出
q = &arr[1];
printf("%p\n",q);
return 0;
}
5、
# include <stdio.h>
void f(int *p);
int main()
{
int i =10;
f(&i);
printf("i = %d\n",i);
return 0;
}
void f(int *p)
{
* p=99;
}
6、 结构体的使用
# include <stdio.h>
# include <string.h>
struct Student
{
int sid;
char name[200];
int age;
}; //分号不能省
int main(void)
{
struct Student st = {1000, "zhangsan", 20};
printf("%d %s %d\n", st.sid, st.name, st.age);
st.sid = 99;
//st.name = "lisi"; //error
strcpy(st.name, "lisi");
st.age = 22;
printf("%d %s %d\n", st.sid, st.name, st.age);
//printf("%d %s %d\n", st); //error
return 0;
}
7、
# include <stdio.h>
# include <string.h>
struct Student
{
int sid;
char name[200];
int age;
}; //分号不能省
void f(struct Student * pst);
void g(struct Student st);
void g2(struct Student *pst);
int main(void)
{
struct Student st; //已经为st分配好了内存
f(&st);
g2(&st);
//printf("%d %s %d\n", st.sid, st.name, st.age);
return 0;
}
//这种方式耗内存 耗时间 不推荐
void g(struct Student st)
{
printf("%d %s %d\n", st.sid, st.name, st.age);
}
void g2(struct Student *pst)
{
printf("%d %s %d\n", pst->sid, pst->name, pst->age);
}
void f(struct Student * pst)
{
(*pst).sid = 99;
strcpy(pst->name, "zhangsan");
pst->age = 22;
}
8、动态内存分配
# include <stdio.h>
# include <malloc.h>
int main(void)
{
int a[5] = {4, 10, 2, 8, 6};
int len;
printf("请输入你需要分配的数组的长度: len = ");
scanf("%d", &len);
int * pArr = (int *)malloc(sizeof(int) * len);
// *pArr = 4; //类似于 a[0] = 4;
// pArr[1] = 10; //类似于a[1] = 10;
// printf("%d %d\n", *pArr, pArr[1]);
//我们可以把pArr当做一个普通数组来使用
for (int i=0; i<len; ++i)
scanf("%d", &pArr[i]);
for (i=0; i<len; ++i)
printf("%d\n", *(pArr+i));
free(pArr); //把pArr所代表的动态分配的20个字节的内存释放
return 0;
}