一级指针和二级指针的简单理解
/*
传入一个常量二级指针,指针指向的变量值无法修改,指针地址可以改
*/
void fun(const char** str) {
*str = "Android";
//此时解引用输出的是一级指针的地址值,但此时该地址值被赋值成常量"Android"的地址
printf("fun addr=%d\n",*str);//853191864
}
void print(char** strs,int len) {
int i;
for (int i = 0; i < len; i++)
{
printf("%s\n",*(strs+i));
}
}
void main() {
const char* name = "HelloWorld";
const char** temp = &name;
//比较二级指针&name与temp的地址
printf("main addr1=%d\n",&name);//-2031093112
printf("main addr2=%d\n",temp);//-2031093112
//修改一级指针的地址值
fun(&name);
//打印一级指针修改后的地址值
printf("main name=%d\n", name);//853191864
//在C语言中,%s格式说明符用于打印字符串,它会打印从指定位置开始直到遇到字符串结束符\0为止的所有字符。
//因此,当你使用printf("main name1=%s\n", name);时,它会打印整个字符串"HelloWorld",而不仅仅是第一个字符'H'。
printf("main name1=%s\n", name);//Android
printf("main name2=%d\n", "Android");//853191864
//如果你只想打印第一个字符
printf("main name3=%c\n", name[0]);//A
//遍历字符串
int index;
for (index = 0; index < strlen(name); index++)
{
//char c = name[index];
char c = *(name+index);
printf("%c\n",c);
}
const int num = 100;
const int* numP = #
printf("numP=%d\n", *numP);
//常量指针无法修改指针指向的值
//*numP = 200;
int num2 = 300;
//但可以修改指针地址
numP = &num2;
printf("numP=%d\n",*numP);
//指针常量无法修改指针地址
int* const numQ = &num2;
printf("numQ=%d\n", *numQ);
//但可以修改指针指向的值
*numQ = 400;
printf("numQ=%d\n", *numQ);
printf("num2=%d\n", num2);
//双常量,就是指针地址和指针地址所指向的值都不能改
const int* const numR = &num2;
printf("numR=%d\n",*numR);
/*二维数组*/
int len = 3;
char** params =(char**)malloc(sizeof(char*)*len);
int i;
for (i = 0; i < len; i++)
{
params[i] = (char*)malloc(sizeof(char) * 100);
sprintf(params[i],"i=%d",i);
}
print(params, len);
for (i = 0; i < len; i++)
{
if (params[i]!=NULL)
{
free(params[i]);
params[i] = NULL;
}
}
if (params != NULL)
{
free(params);
params = NULL;
}
getchar();
}
网友评论