c语言指针
/*
使用指针的好处:
1.使程序简洁、紧凑、高效
2.有效的表示复杂的数据结构
3.动态分配内存
4.得到多于一个的函数返回值
*/
test1:概念->存储地址的变量
test2:运算->算术运算、赋值运算、关系运算
test3:二维数组指针
test4:字符指针与字符串指针
test5:指针数组与多级指针
test6:void指针与const修饰符
环境—>Visual Stdio 2019
#include <stdio.h>
void test1(void);
void test2(void);
void test3(void);
void test4(void);
void test5(void);
void test6(void);
int main(void)
{
test1();test2();test3();
test4();test5();test6();
return 0;
}
/*指针的基本概念*/
void test1(void)
{
int a = 1;
int* p = &a;
printf("test1:p:%p *p:%d &p:%p\n",p,*p,&p);
puts("");
}
/*指针之间的运算与一维数组指针*/
void test2(void)
{
int a[] = {1,2,3,4,5};
int* p = a;
int i,n,t;
int* q;
i = sizeof(a) / sizeof(int); n = i;//得到数据个数
printf("test2: *(p+2):%d &a[3]-&a[0]:%d",*(p+2), (&a[3] - &a[0]));
/*使用指针遍历数组*/
printf(" 使用一级指针遍历一维数组:");
while (i != 0){
printf("%d ",*(p+n-i));
i--;
}
printf("\n ");
printf("一维数组值的四种表达方式:");
printf("*(p+1):%d p[1]:%d a[1]:%d *(a+1):%d", *(p + 1), p[1], a[1], *(a + 1));
printf("\n ");
printf("使用一级指针实现数组反转:");
q = &a[n-1];
while (p < q) {
t = *p;
*p = *q;
*q = t;
p++; q--;
}
i = n;
while (i != 0) {
printf("%d ",a[n-i]);
i--;
}
puts("");
puts("");
}
/*二维数组指针*/
void test3(void)
{
int a[2][3] = {{1,2,3},{4,5,6}};
int* p1;
int(*p2)[3];//行指针变量
p2 = a;
printf("test3:%p %p %p: %p: \n",a,a+1,a[0]+1,*a+1);//*改变了指针的性质
printf(" 使用行指针表示二维数组:%d\n",p2[1][1]);
printf(" 从行指针变为一级指针 :%d %d\n", *(*(a+1)+1),*(*(p2+1)+1));
puts("");
}
/**/
/*字符指针与字符串指针*/
void test4(void)
{
char ch = 'q';
char str[100] = "vscode";
char* p = "vstdio";
char* p1 = &ch;
char* p2 = &str;
int i = 0;
printf("test4: %c %s %s\n",*p1,p,p2);
//实现两个字符串的连接
while (*(p2 + i) != '\0')
i++;
while (*p != '\0') {
*(p2 + i) = *p;
p++;
i++;
}
*(p2 + i) = *p;
printf(" ");
puts(p2);
puts("");
}
/*指针数组与多级指针*/
void test5(void)
{
int a[2][3] = { {1,2,3},{7,8,9} };
int* p[2];
int** p1;
p[0] = a[0];
p[1] = a[1];
printf("test5: %d %d\n",*(p[0]+1),*p[1]);
p1 = p;
printf(" %d\n",**p1);
puts("");
}
/*void指针与const修饰符*/
void test6(void)
{
int m = 4,i;
void* p;
int a[5] = {1,2,3,4,5};
int n = 2;
//const修饰什么什么就不能改
const int* b;//修饰变量
int* const c = &n;//修饰地址
p = (void*)&m;//强制转换,其实这里可以隐式转换
printf("test6: %d\n ",*(int *)p);
//使用void指针遍历数组
p = a;
for (i = 0;i < 5;i++)
printf("%d",*((int *)p+i));
b = &m; b++;//合法,修改地址
*c +=1;//合法,修改变量
puts("");
}