字符指针 数组指针 指针数组 函数指针用法等详解

指针详解

1.字符指针

int main() 
{    
char str1[] = "hello world.";    
char str2[] = "hello world .";   
char *str3 = "hello world .";   
char *str4 = "hello world.";

  if(str1 ==str2)        
    printf("str1 and str2 are same\n");   
   else        
     printf("str1 and str2 are not same\n");            
   if(str3 ==str4)      
    printf("str3 and str4 are same\n");   
   else      
       printf("str3 and str4 are not same\n");         
          return 0;
        } 
   

输出的结果是str1 and str2 are not same
str3 and str4 are same

因为"hollow world"是常量字符串,C/C++常把常量字符串存储在同一内存块中,当几个指针同时指向同一个常量字符串的时候,实际是指向同一块内存。 而 用相同的常量字符串去初始化不同的数组,其实开辟出了不同的内存块。

2.指针数组

是一个存放指针的数组,本质没有变还是数组;

int *arr[10];//存放十个整形指针的数组
char *arr1[10];//一级字符指针数组
char **arr2[10];//二级字符指针数组


char *arr[3] = { "abc", "bnm","cnm"};//实际上是存放a b c的地址,也就是字符串的首地址,而不是把所有字符全部存进去。

3. 数组指针

本质是指针

int  (*p)[3] ;//p是指针 指向一个有三个整型元素的数组

数组指针int (*p)[3] 和指针数组int p[ 3] 的区别;[ ] 的优先级高于,没有() p就先和 [ ] 结合 成数组,有(*p)就先结合成指针;

4. &数组名和 数组名

这也是很容易弄错的地方,因为有特列

int arr[2] = {0};
printf("%p\n", arr);
printf("%p\n",&arr);

可以尝试这段代码,看输出结果是否相同。
其实结果是相等的,但它们所表示的意义不一样

int main() {  
  int arr[10] = { 0 };  
    printf("arr = %p\n", arr);   
     printf("&arr= %p\n", &arr);
 
    printf("arr+1 = %p\n", arr+1);   
     printf("&arr+1= %p\n", &arr+1); 
     return 0;
     }

结果就会发现结果并不相同,
因为arr表示的是首元素地址 你加一是它指向第二个元素
&arr表示的是真个数组的地址,你加一他就指向下一个数组,
跳过的是整个数组的大小,是10个整型元素也就是40个字节;
但也有列外

sizeof(arr) 里的arr代表的是整个数组地址;而不是首地址,&数组名 也是整个地址

除此之外 数组名全是首地址

5.数组指针的使用

既然是数组指针,那数组指针中存放的应该是数组地址

void print_arr1(int arr[3][5], int row, int col)
	{
		int i = 0;   
		for (i = 0; i<row; i++)    
		{
			for (j = 0; j<col; j++)

			{
				printf("%d ", arr[i][j]);
			}        printf("\n");
		}
	}
	void print_arr2(int(*arr)[5], int row, int col)
	{ 
		
		int i = 0;    
		for (i = 0; i<row; i++)    
		{
			for (j = 0; j<col; j++)        
			{ 
				printf("%d ", arr[i][j]); }       
			printf("\n");
		}
	} 
	int main() {
		int arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
		print_arr1(arr, 3, 5);   
		//数组名arr,表示首元素的地址   
		//但是二维数组的首元素是二维数组的第一行  
		//所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址    
		//可以数组指针来接收   
		print_arr2(arr, 3, 5); 

函数指针

void test() 
    {
        printf("hehe\n"); 
    }
     int main()
     {   
         printf("%p\n", test);   
         printf("%p\n", &test);
          return 0;
     }

void (*pfun1)() = test; 是一个指针函数 指向test

函数指针数组

int (*parr1[10]])(); 

还是结合性的先后顺序,同前面指针数组和数组指针。

猜你喜欢

转载自blog.csdn.net/qq_42381855/article/details/87864098