又名二维指针
语法:数据类型 **p;
示例:
概念
语法
数据类型 * const 指针变量名
示例
void fun()
{
int num = 10;
int num1 = 5;
int * const p = #
*p = 100;//可以修改值
printf("num=%d\n",*p);
}
概念
指向常量的指针,本质是一个指针,不能通过指针改变其指向的地址中的数据,但是可以改变其存储的地址
语法
const 数据类型 * 指针变量名 or 数据类型 const * 指针变量名
示例
void fun()
{
int num = 10;
int num1 = 5;
const int * p = #
//*p = 100;//不可以修改值
printf("num=%d\n",*p);
}
概念
指向的地址与指向的地址中的数据都不能被修改
语法
const 数据类型 * const 指针变量名
数据类型 const * const 指针变量名
示例
void fun()
{
int num = 10;
int num1 = 5;
const int * const p = #
//*p = 100;//不可以修改值
printf("num=%d\n",*p);
}
以上名称在网上有所不同,以上为主流说法
概述
数组,是多个相同类型的变量的集合, 每个变量都占内存空间,都有地址编号 ,指针变量当然可以存放数组元素的地址
注意
只有两个相同类型的指针指向同一个数组的元素的时候,比较大小才有意义 ,指向前面元素的指针小于指向后面元素的指针
示例
void fun04()
{
int nums[] = {1,3,5,7,9,2,4,6,8,0};
int *p = &nums[3];
printf("%d\n",*p);
//因为数组在内存中是连续开辟的
//所以我们可以通过对指针的加减使其指向数组中不同位置的元素
printf("%d\n",*(p+1));
printf("%d\n",*(p+2));
printf("%d\n",*(p-1));
printf("%d\n",*(p-2));
//指针变量存储的地址编号,地址编号是一个十六进制的数
printf("%p\n",&nums[0]);
printf("%p\n",&nums[1]);
//因为地址编号是一个十六进制的数所以我们可以对其使用关系运算符
if(&nums[0] < &nums[1])
{
printf("nums[0]在前\n");
}
else
{
printf("nums[1]在前\n");
}
//两个相同类型的地址相差,使用十六进制数相差之后得到的数值 除以其数据类型的字
节大小,为最终结果
printf("%ld\n",&nums[0] - &nums[1]);
}
概述
语法
void fun05()
{
//指针与一维数组
int nums[10] = {1,3,5,7,9,2,4,6,8,0};
//数组名其实是数组中首元素的地址
printf("%p\n",nums);
printf("%p\n",&nums[0]);
//数组名可以赋值给一个指针变量
int * p1 = nums;
char str[] = "hello";
char * p2 = str;
//此时我们可以理解为指针变量就等价与其指向的数组的数组名
//顾我们可以通过指针变量名[下标]获取其指向的数组中指定位置的元素
printf("%d\n",p1[1]);
printf("%c\n",p2[1]);
//指针与二维数组
int numss[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int (*p3)[5] = numss;
printf("%d\n",p3[1][2]);
char strs[5][50] = {"hello","world","c++","python","c"};
char (*p4)[50] = strs;
printf("%c\n",p4[1][2]);
printf("%s\n",p4[1]);
}
//遍历数组元素
void fun06()
{
int nums[10] = {1,3,5,7,9,2,4,6,8,0};
//数组名就是数组第一个元素的的地址
int *p = nums;
for(int i = 0; i < 10; i++)
{
// printf("num[%d] = %d\n",i,*(p + i));
// printf("num[%d] = %d\n",i,*(nums + i));
// printf("num[%d] = %d\n",i,*(p++));
//注意数组的变量名是一个指针常量
//printf("num[%d] = %d\n",i,*(nums++));
}
}
void fun07()
{
char str01[] = "hello";
char *str02 = "hello";
//指针常量能修改其指向地址的元素,但是不可以修改其指向的地址
str01[0] = 'H';
printf("str01=%s\n",str01);
//会产生段错误
//常量指针不能修改其指向地址的元素,但是可以修改其指向的地址
//str02[0] = 'H';
//printf("str01=%s\n",str02);
str02 = "world";
函数与指针
printf("str02=%s\n",str02);
//使指针变量指向栈中的字符数组
char *str03 = str01;
str03[0] = 'H';
printf("str03=%s\n",str03);
str03 = "world";
printf("str03=%s\n",str03);
}
void fun08()
{
int a = 1,b = 2,c = 3;
int * p[] = {&a,&b,&c};
printf("%d\n",*(p[0]));
printf("%d\n",*(p[1]));
printf("%d\n",*(p[2]));
}
概述
示例
void test01()
{
printf("test01函数被调用\n");
}
void test02(int a,int b)
{
printf("test02函数被调用\n");
}
void test03(int a,int b)
{
printf("test03函数被调用\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
}
int test04(int a,int b)
{
printf("test04函数被调用\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
return a+b;
}
void fun09()
{
void (*p1)() = test01;
p1();
void (*p2)() = test02;
p2();
void (*p3)(int,int) = test03;
p3(10,12);
int (*p4)(int,int) = test04;
int num = p4(10,12);
printf("num=%d\n",num);
}
void changNum(int *p)
{
*p = 20;
}
void fun10()
{
int num = 10;
changNum(&num);
printf("num=%d\n",num);
}
void changName(char *p)
{
p = "高三石";
}
void fun11()
{
char *name = "高磊";
changName(name);
printf("name=%s\n",name);
}
void changName02(char **p)
{
*p = "高山石";
}
void fun12()
{
char *name = "高磊";
changName02(&name);
printf("name=%s\n",name);
}
void set(int*nums)
{
nums[0] = 10;
}
void fun13()
{
int nums[5] = {0};
printf("set 前 nums[0]=%d\n",nums[0]);
set(nums);
printf("set 后 nums[0]=%d\n",nums[0]);
}
void getName01(char * ns[],int i)
{
printf("%s\n",ns[i]);
}
void getName02(char ** ns,int i)
{
printf("%s\n",*(ns+i));
}
void setName(char ** ns,int i,char * newName)
{
*(ns+i) = newName;
}
void fun14()
{
char * names[3] = {"c","c++","sql"};
getName01(names,1);
getName02(names,2);
char * name = "cplusplus";
setName(names,1,name);
getName01(names,1);
}
int *getNums01()
{
int nums[3] = {1,2,3};
return nums;
}
int *getNums02()
{
static int nums[3] = {1,2,3};
return nums;
}
void fun15()
{
//int *p01 = getNums01();
//printf("%d\n",*(p01+1));
int *p02 = getNums02();
printf("%d\n",*(p02+1));
}