0
点赞
收藏
分享

微信扫一扫

c语言进阶-第2节-指针

北邮郭大宝 2022-01-16 阅读 95

1.字符指针

1.1.字符指针

int main()
{
    //1
    char ch='w';
    char* p=&ch;

    //2
    char* p="abcdef";
    *p='w';   //该语句错误

    //3
    const char* p="abcdef";

    return 0;
}

注:

1.代码1是建立变量ch,ch变量空间里面存放字符'w';定义指针变量里面存放变量ch的地址,使指针变量p可以指向变量ch的空间

2.代码2的语句1是将字符串"abcdef"存储在内存的只读数据区(只读数据区里面的数据只能读取),然后将这个字符串的地址(起始地址)放在指针变量p中。

代码2的语句2是不能实现的,因为"abcdef"存在了只读数据区,无法进行更改(强行运行,程序会卡死)

3.代码3是代码2语句1的规范形式。因为代码2不能对只读数据区内的数据进行更改,也就是不能对指针变量p进行解引用,因此在前面用const修饰代码更加严谨。(有些编译器不加const是会报警告的)

1.2.练习

练习一:

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";

	const char* str1 = "abcdef";
	const char* str2 = "abcdef";

	if (arr1 == arr2)
		printf("arr1==arr2\n");
	else
		printf("arr1!=arr2\n");

	if (str1 == str2)
		printf("str1==str2\n");
	else
		printf("str1!=str2\n");

	return 0;
}

运行结果:

注:

1.arr1和arr2是两个不同的数组,数组名代表数组首元素的地址,因此arr1不等于arr2

2.只读数据区内,相同的数据只存一份,所以,上面代码的str1和str2均指向只读数据区内字符串"abcdef"的地址(首地址)

练习二:

typedef int* pint;

#define PINT int*

int main()
{

    //1  
    int a,b;

    //2
    int * pa,pb;

    //3
    int * pa, * pb;

    //4
    pint pa,pb;

    //5
    PINT pa,pb;

    return 0;
}

注:

1.代码1中:变量a和b都是int类型

2.代码2中:变量pa是int*类型,是指针变量;变量pb是int类型

3.代码3中:变量pa和pb都是int*类型,是指针变量

4.代码4中:变量pa和pb都是int*类型,是指针变量

5.代码5中:代码运行的时候会将PINT换成int*,因此结果和代码2相同。

   变量pa是int*类型,是指针变量;变量pb是int类型


2.指针数组

2.1.指针数组

2.2.例子

例1:

#include<stdio.h>

int main()
{
	char* arr[] = { "abcdef", "qwer", "zhangsan" };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);

	for (i = 0; i < sz; i++)
	{
		printf("%s\n", arr[i]);
	}
	return 0;
}

运行结果:

注:

该数组在内存中是如下图存储的 :

 

例2:

#include<stdio.h>

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };

	int* arr[] = {arr1, arr2, arr3};

	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);//*(*(arr+i)+j)
		}
		printf("\n");
	}

	return 0;
}

运行结果:

 

注: 

1.该数组在内存中是如下图存储的 :

2.代码中:arr[ i ][ j ]) 和 *(*(arr+i)+j)是一样的


举报

相关推荐

0 条评论